Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Why does this projectile behave so erratically with PGSPhysicSolver Enabled?

Asked by 7 years ago

Below is the code that simulates a projectile shout out a canon. This canon preforms fine when the SGSPhysicSolver is disabled. However, I would like to utilize the PhysicSolver in my game. Any advice on changes I could try?

Cannon-

function Fire(t)
    t.Gun.FireSound:Play()
    t.Gun.Fire:Emit(20)
    t.Gun.Smoke:Emit(20)
    t.Gun.Muzzle.Enabled = true
    delay(0.1,function() t.Gun.Muzzle.Enabled = false end)
    FastSpawn(function()
        for i = 1,5 do
            t.FBarrel.Weld.C0 = t.FBarrel.Weld.C0*CFrame.new(0,0,-0.8)
            wait()
        end
        for i = 1,20 do
            t.FBarrel.Weld.C0 = t.FBarrel.Weld.C0*CFrame.new(0,0,0.2)
            wait()
        end
    end)
    local shell = sp.Shell:clone()
    shell.Parent = workspace
    shell.Core.Weld:Destroy()
    shell.Core.Fire.Enabled = true
    shell.Core.Smoke.Enabled = true
    shell.Shell.Transparency = 0
    shell.Core.CFrame = t.Gun.CFrame * CFrame.new (0,0,2.2)
    shell.Core.Velocity = t.Gun.CFrame.lookVector * set.ShellSpeed
    shell.Core.CFrame = shell.Core.CFrame * CFrame.fromEulerAnglesXYZ(0,math.rad(-90),math.rad(180))
    game:GetService("Debris"):AddItem(shell,set.ShellDuration)
    local gravity = Instance.new("BodyForce", shell.Core)
    for i,v in pairs (shell:GetChildren()) do
        gravity.force = Vector3.new(0, gravity.force.Y + v:GetMass() * set.ShellGravity, 0)
    end
    local touched = false
    shell.Core.Touched:connect(function(part)
        if part.Parent ~= sp and part.Parent ~= t then
            if touched == false then
                touched = true
                Explode(shell.Core.Position)
                DamageVehicle(part)
                for _,plr in pairs(game.Players:GetPlayers()) do
                    if plr:DistanceFromCharacter(shell.Core.Position) <= set.ExplosionRadius and plr.TeamColor ~= sp.Team.Value then
                        plr.Character.Humanoid:TakeDamage(set.Damage)
                        wait()
                    end
                end
                shell:Destroy()
            end
        end
    end)
end

Settings-

local set = {
ExplosionRadius = 8;    --Radius of the explosion       
ShellDuration = 10;     --Duration of the shell (cleanup purposes)
Damage = 100;       --Damage of explosion
ShotCooldown = 1.8; --Single shot cooldown
ShellSpeed = 600;       --Velocity of the shell
CannonRotate = 0.25;    --Increment of the barrel rotation up/down
PlatformRotate = 0.75;  --Increment of the turret rotation left/right
CRMaxPos = 30;      --Maximum upwards rotation of the barrel -- RADIANS
CRMaxNeg = 15;      --Minimum downwards rotation of the barrel -- RADIANS
RepairTime = 300;
Health = 1000;
SidMaxRot = 150;        --Maximum sideway rotation of the turret --RADIANS
ShellGravity = 180;     --Gravity of the shell, 196.2 is ZERO GRAVITY
}

return set

Answer this question