I'm pretty sure this is something I will have to remedy with a Remote Function or something but I'd thought I'd post my script here and see if someones points something out that I might have missed.
I'm not an absolute beginner to Roblox Lua, but this is the first time that I've ever decided to focus my knowledge on building something specific from scratch (barring the programming knowledge I can obtain off the Internet, free models, or even this site.)
I'm building a little Howitzer cannon that fires an explosive projectile when the F key is pressed. Here is the relevant code:
control = false -- default setting, if the local player has control over the howitzer or not
fired = false -- firing mechanism debounce
pilotseet:GetPropertyChangedSignal("Occupant"):connect(function ()
wait(.5)
if pilotseet.Occupant ~= nil and pilotseet.Occupant == humanoid then -- is seat is in use, and if user is localplayer
control = true
wait(.1)
print("Artillery activated, user "..localplayer.Name.." operating cannon.")
inputservice.InputBegan:connect(function (key, processed)
if key.KeyCode == Enum.KeyCode.F and control == true and fired == false then
fired = true
local Howitzer_Shell = storage.HeavyShell -- gets the round
local Emitted_Howitzer_Shell = Howitzer_Shell:clone() -- clones it for the purpose of emitting it
Emitted_Howitzer_Shell.Name = ""..localplayer.Name.."'s HowitShell"
Emitted_Howitzer_Shell.Parent = workspace
Emitted_Howitzer_Shell.CFrame = cannonFunction.ArtilleryEmit.CFrame * CFrame.new(0, 0, 2)
Emitted_Howitzer_Shell.Velocity = cannonFunction.ArtilleryEmit.CFrame.lookVector * 550
local whistle = Emitted_Howitzer_Shell.shellScream
whistle:Play()
fireSound:Play() -- this code works fine, it makes the projectile come out the barrel as intended. i omitted the rest of the controls (traverse/elevation) but it all works despite not being connected to any remoteevents/remotefunctions
end
end)
When the F key is pressed, the shell is properly cloned and emitted from the barrel, and when it touches something the following code SHOULD be executing. Don't go through it too deeply because it does work, I'll get into how after the code block
local explosionSound = sphere.explosionSound
function explosionReduce(explosionV)
if explosionV ~= nil then
explosionSound:Play()
wait(.1)
for i = 0, 1, 0.05 do
explosionV.Transparency = i
wait(.005)
end
explosionV.Transparency = 1
explosionSound.Ended:wait()
explosionV:Destroy()
end
end
explosion = Instance.new("Explosion")
explosion.BlastRadius = 25
explosion.BlastPressure = 15
explosion.ExplosionType = Enum.ExplosionType.NoCraters
explosion.DestroyJointRadiusPercent = 1
explosion.Visible = false
function GetPosition(positionCoord)
return positionCoord.Position
end
shell.Touched:connect(function (touch)
if touch:IsA("BasePart") and touch.Name ~= "ExplosionOrb" then
local impactPosition = GetPosition(shell)
local activeBlast = explosion:clone()
activeBlast.Name = "ImpactBlast"
activeBlast.Position = impactPosition
activeBlast.Parent = workspace
if artillery_screech.Playing == true then
artillery_screech:Stop()
end
shell.Parent = game.Lighting -- conveniently takes the shell out of the workspace so it stops generating touched events without having to delete it, which obliterates the script as well
local FX = sphere:clone() -- custom blast effect defined but not in code block
FX.Position = activeBlast.Position
FX.Parent = workspace
explosionReduce(FX) -- remove custom blast effect if it exists
shell:Destroy()
end
end)
So the thing is, when the projectile is fired by the client, it simply falls through the map instead of its code executing. However, when the same method is applied for summoning the projectile (cloning it, setting its clone's position/velocity, etc.) in a while script in workspace, the projectile explodes perfectly fine when it is fired from the barrel.
So even though I suppose it's really obvious that I should be setting up some remote events/remote functions (especially if I want the cannon code to replicate across clients in the game I'm making), I want to know the best way of doing so. Should I let players control their own projectiles? Or the server? Would I have to do a major overhaul to my script if I were to relocate the code to a remote function (which in that case, where would I even put it?)
All help is appreciated, thanks!

4 comments
Is the cannon ball set to CanCollide = true?
I would try to use server as much as I can, as exploiters may get too much power if you leave it to the client
@DemGame It is not, but CanCollide doesn't have to be enabled for the Touched event to run. When I clone the projectile as is in the workspace, the clone's scripts run perfectly well and the projectile detonates where it is supposed to once it lands.
@Leamir You're very right, I'll keep that in mind.