0
votes

I'm making a game using ROBLOX about the tank battle system of Dragon Quest Heroes Rocket Slime (although not using 100% GUI's)

Since I didn't know how to make ammo become locked onto a path in normal ROBLOX, I decided to use a gui to show the ammo "firing"

To do this, I have a remote event that fires a function inside the main script of the GUI system when ammo is loaded

cannon.Touched:connect(function(v)
    if fireable[v.Name] and v.Parent == workspace then
        event:FireAllClients("Left",v.Name)
        v:Destroy()
    end
end)

Then, the GUI gets the correct sprite for the ammo loaded and fires it out of the right tank (the first argument in the FireAllClients part)

This is one of the two if statements for firing ammo (the other one is literally the same except that it's for the right side tank)

local tank = tankFiring == "Left" and tank1 or tankFiring == "Right" and tank2
if tank == tank1 then
    print("yo!")
    script.Fire:Play()
    local ammoFrame = sp.Ammo:Clone()
    ammoFrame.Parent = tank
    ammoFrame.Visible = true
    ammoFrame.Position = UDim2.new(0,120,0,68)
    playAnimation("Cannon Fire",UDim2.new(0,120,0,68-25),tank.Frame)
    ammoFrame.Image = ammoTypes[type]["img"]
    ammoFrame.Size = ammoTypes[type]["Size"]
    repeat 
        wait(.1) 
        ammoFrame.Rotation = ammoTypes[type]["Rotatable"] == true and ammoFrame.Rotation + 15 or 0
        ammoFrame.Position = ammoFrame.Position + UDim2.new(0,1,0,0)
    until
    tank2:FindFirstChild("Ammo") and isTouching(ammoFrame,tank2:GetChildren()[3]) or isTouching(ammoFrame,tank2) or ammoFrame == nil

    if tank2:FindFirstChild("Ammo") and isTouching(ammoFrame,tank2:GetChildren()[3]) then
        script.Collision:Play()
        local lastAmmoPos = ammoFrame.Position
        playAnimation("Explosion",lastAmmoPos-UDim2.new(0,15,0,25),tank.Frame)
        ammoFrame:Destroy()
        tank2:GetChildren()[3]:Destroy()
    end
    if isTouching(ammoFrame,tank2) then
        script.Collision:Play()
        ammoFrame:Destroy()
        workspace["Tank2"].Health.Value = workspace["Tank2"].Health.Value - ammoTypes[type]["dmg"]
    end
end

The problem with this, is that if a player joins AFTER the ammo has been shot, they will not see the ammo on the GUI

Is there anyway to fix this? I can't just FireAllClients again, since that'll just fire another piece of ammo for all the players.

1

1 Answers

0
votes

Have a service that keeps track of what ammo is in what state. Then all clients first asks the servers of current ammo states when joining, and then subscribes to further changes.