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);
}
}
}