Hi, i’m brand new to this and am failing miserably. I have a new project with baseplate. I have a Sphere part, which is going to be my cannon ball. I want the ball to fire towards the nearest player. If it hits him, he dies. If it misses and hits the floor, it resets to it’s original position and fire again.
My ball has an Attachment, a script, and a VectorForce. VectorForce.RelativeTo is set to World.
This is my script so far (don’t forget i’m totally new!):
local RunService = game:GetService("RunService")
ball = script.Parent
local startPos = ball.Position
local isFiring = false
local emptyV3 = Vector3.new(0,0,0)
closest = nil
function checkHRP() --stolen from ReturnedTrue https://devforum.roblox.com/t/npc-that-runs-away-from-nearest-player/392568
local closest
local closestMagnitude = 300
for _, player in pairs(game:GetService("Players"):GetPlayers()) do
if player.Character then
local hrp = player.Character:FindFirstChild("HumanoidRootPart")
local hrpMagnitude = hrp and (ball.Position - hrp.Position).Magnitude or math.huge
if closestMagnitude >= hrpMagnitude then
closestMagnitude = hrpMagnitude
closest = hrp
end
end
end
return closest
end
local function onPartTouch(otherPart)
if (otherPart.Position.Y<5) --5 is lower than my lowest platform, so I want to reset the ball to its original position
then
print "hit the floor"
ball.VectorForce.Enabled = false -- stop the ball moving. next heartbeat should then start it off again
else
local partParent = otherPart.Parent
local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
if (humanoid) then
humanoid.Health = 0
ball.VectorForce.Enabled = false --kill the player and stop the ball moving
end
end
end
local function heartBeat(currentTime, deltaTime)
print (ball.Position)
print "force:"
print (ball.VectorForce.Force)
if (not ball.VectorForce.Enabled) then --if we're already moving the ball, don't do anything
closest = checkHRP() -- get the nearest human
if (closest)
then
print "heartbeat reset"
ball.Position = startPos --reset the ball to its original position
local LV = CFrame.new(ball.Position,closest.Position).LookVector *200 --think this gets a force which will send the ball towards the player,tried allsorts here.
ball.VectorForce.Force = LV --apply that force to the ball
ball.VectorForce.Enabled = true --enable and hopefully start the ball moving
end
end
end
I’ve tried with BodyForce/LineForce in place of VectorForce but it’s still not doing what I want. The balls start position is way up in the air (where i want it because i’ll have a cannon mounted on a tower there). The player is on the baseplate. I was hoping the VectorForce would shoot the ball in a downward angle towards the player, but instead it seems to head towards him in the X/Z, but goes up in the air a little bit, then plummets to the ground (gravity). The strange thing is, each time it resets, without the player moving, the ball gets fired further and further away until eventually it goes off the edge of the world and I assume gets disposed. I’d like it to be less affected by gravity, not go up in the air, and have half a chance of hitting the player if he doesn’t move. I’m fairly sure it’s the CFrame bit that isn’t doing what I think it is.
Any tips/pointers gratefully accepted.