SkylinesMultiplayer.VehicleNetworkManager.ServerSendCarPositions C# (CSharp) Method

ServerSendCarPositions() public method

public ServerSendCarPositions ( ) : void
return void
        void ServerSendCarPositions()
        {
            if (MultiplayerManager.instance.m_isServer)
            {
                foreach (var player in MultiplayerManager.instance.m_players)
                {
                    if(player.OwnerConnection == null)
                        continue;

                    if(!m_fakeCars.ContainsKey(player.ID))
                        m_fakeCars.Add(player.ID, new List<int>());

                    int searchSize = m_fakeCars[player.ID].Count > CAR_POOL_NEAR_LIMIT ? SEARCH_SIZE_NEAR_LIMIT : SEARCH_SIZE;

                    int gridX = Mathf.Clamp((int)((player.PlayerGameObject.transform.position.x / 32f) + 270f), 0, 0x21b);
                    int gridZ = Mathf.Clamp((int)((player.PlayerGameObject.transform.position.z / 32f) + 270f), 0, 0x21b);

                    var vInstance = Singleton<VehicleManager>.instance;
                    var mInstance = MultiplayerManager.instance;

                    bool breakLoop = false;
                    //Adds all cars in the nearby grids
                    for (int k = -searchSize; k < searchSize; k++)
                    {
                        for (int l = -searchSize; l < searchSize; l++)
                        {
                            int index = ((gridZ + k) * 540) + gridX + l;
                            int carID = vInstance.m_vehicleGrid[index];
                            while (carID != 0)
                            {
                                var vehicle = vInstance.m_vehicles.m_buffer[carID];
                                if (!m_fakeCars[player.ID].Contains(carID))
                                {

                                    if ((vehicle.m_flags & Vehicle.Flags.Spawned) != Vehicle.Flags.None || vehicle.Info.m_instanceID.ParkedVehicle == 0)
                                    {
                                        if (m_fakeCars[player.ID].Count >= CAR_POOL_SIZE)
                                        {
                                            breakLoop = true;
                                            break;
                                        }

                                        m_fakeCars[player.ID].Add(carID);
                                    }
                                }
                                carID = vehicle.m_nextGridVehicle;
                            }
                        }
                        if (breakLoop) break;
                    }

                    var carsToRemove = new List<int>();

                    foreach (var carID in m_fakeCars[player.ID])
                    {
                        var vehicle = vInstance.m_vehicles.m_buffer[carID];
                        Vector3 carPosition;
                        Quaternion carRotation;
                        vehicle.GetSmoothPosition((ushort)carID, out carPosition, out carRotation);

                        if ((vehicle.m_flags & Vehicle.Flags.Spawned) == Vehicle.Flags.None || vehicle.Info.m_instanceID.ParkedVehicle != 0 || Vector3.SqrMagnitude(player.PlayerGameObject.transform.position - carPosition) > Math.Pow((SEARCH_SIZE + 1) * 32 + 10, 2))
                        {
                            carsToRemove.Add(carID);
                        }
                    }

                    carsToRemove.ForEach(x =>
                    {
                        m_fakeCars[player.ID].Remove(x);

                        NetOutgoingMessage om3 = mInstance.m_server.CreateMessage();
                        om3.Write((int)MessageFunction.RemoveVehicle);
                        om3.Write(x);
                        mInstance.m_server.SendMessage(om3, player.OwnerConnection, NetDeliveryMethod.ReliableUnordered, 0);
                    });

                    NetOutgoingMessage om2 = mInstance.m_server.CreateMessage();
                    om2.Write((int)MessageFunction.UpdateVehiclesPositions);
                    om2.Write(m_fakeCars[player.ID].Count);
                    foreach (var carID in m_fakeCars[player.ID])
                    {
                        var vehicle = vInstance.m_vehicles.m_buffer[carID];
                        Vector3 carPosition;
                        Quaternion carRotation;
                        vehicle.GetSmoothPosition((ushort)carID, out carPosition, out carRotation);

                        //We need to check position manully insted of using grids for when removing vehicles,
                        //becuse the a vehicle switch grids it disappears for one simulation frame

                        om2.Write(carID);
                        om2.Write(vehicle.Info.m_prefabDataIndex);

                        om2.Write(carPosition.x);
                        om2.Write(carPosition.y);
                        om2.Write(carPosition.z);

                        om2.Write(carRotation.x);
                        om2.Write(carRotation.y);
                        om2.Write(carRotation.z);
                        om2.Write(carRotation.w);
                    }
                    mInstance.m_server.SendMessage(om2, player.OwnerConnection, NetDeliveryMethod.Unreliable, 0);

                }
            }
        }