I am trying to make a game including Tanks. I have custom coded a suspension system and movement system, and those work fine in online mode, online mode being the testing server, not the studio "Play" mode. Recently, I've been experimenting with finally getting a turret I've had connected to my main hull finally aiming with the mouse, using the servo actuator type on the hinge constraint I used to connect it. In solo mode (Studio's "Play" mode) it works absolutely perfectly. Problem is, once I tested it on the server, it began to go crazy, and seemed laggy like it was processing on the server, not the client like I'd specified using setNetworkOwner() for all parts of my tank model. A bit of experimentation later, and I find that GetNetworkOwner() is returning nil on the parts I had specifically set to the controlling player, using a remote function. Going further, I decided to add a delay between spawning and activating the servo on the constraint. What do you know, everything went smoothly until the servo activated, and made everything go crazy again, as you can see in this video
The servo activates 5 seconds after spawning, where the tank begins to flip out. I'd appreciate any help I can get.
Script for aiming the gun:
if playerVehicle and turret and gun and turretHinge then local cameraRay = Ray.new(camera.CFrame.p, camera.CFrame.lookVector * lengthOfRay) local rayResult, aimpoint = workspace:FindPartOnRayWithIgnoreList(cameraRay, {aimPointInd}) --aimPointInd.CFrame = CFrame.new(aimpoint) aimpoint = hull.CFrame:pointToObjectSpace(aimpoint).unit --local aimpoint = (aimpoint - hull.CFrame.p).unit local tan1 = (aimpoint.X) local tan2 = (aimpoint.Z) if tan1 <= 0 and tan2 <= 0 or tan1 >= 0 and tan2 <= 0 then azumithDif = -math.atan(tan1/tan2) * 180 / math.pi elseif tan1 >= 0 and tan2 >= 0 or tan1 <= 0 and tan2 >= 0 then azumithDif = 180-math.atan(tan1/tan2) * 180 / math.pi end turretHinge.TargetAngle = azumithDif end
Gun Setup function:
function gunSetup() if gunAzumithLimits[1] and gunAzumithLimits[2] then turretHinge.LimitsEnabled = true turretHinge.UpperAngle = gunAzumithLimits[1] turretHinge.LowerAngle = gunAzumithLimits[2] end if gunElevationLimits[1] and gunElevationLimits[2] then gunHinge.LimitsEnabled = true gunHinge.UpperAngle = gunAzumithLimits[1] gunHinge.LowerAngle = gunAzumithLimits[2] end wait(5) --The 5s delay you can see in the video turretHinge.ActuatorType = 2 turretHinge.AngularSpeed = 5 --Change later turretHinge.ServoMaxTorque = 1000000 end
EDIT: Nevermind, I've solved it. For future reference and anyone having the same problem, when you're working with custom characters with constraints, activating the actuator seems to reset network ownership of the connected parts. Simply create and call a remoteFunction that loops thru and sets network ownership after you activate the servos.