/// <summary> /// Handle full world sync message. /// </summary> /// <param name="msg">The message to handle.</param> public void HandleFullWorldSync(Messages.FullWorldSyncMessage msg) { // Read time Game.GameWorld gameWorld = Game.GameWorld.Instance; gameWorld.WorldTime = msg.dayTime; gameWorld.WorldDay = msg.day; // Read mailbox name gameWorld.PlayerLastName = msg.mailboxName; // Doors. foreach (Messages.DoorsInitMessage door in msg.doors) { Vector3 position = Utils.NetVec3ToGame(door.position); Game.Objects.GameDoor doors = Game.GameDoorsManager.Instance.FindGameDoors(position); Client.Assert(doors != null, $"Unable to find doors at: {position}."); if (doors.IsOpen != door.open) { doors.Open(door.open); } } // Lights. foreach (Messages.LightSwitchMessage light in msg.lights) { Vector3 position = Utils.NetVec3ToGame(light.pos); Game.Objects.LightSwitch lights = Game.LightSwitchManager.Instance.FindLightSwitch(position); Client.Assert(lights != null, $"Unable to find light switch at: {position}."); if (lights.SwitchStatus != light.toggle) { lights.TurnOn(light.toggle); } } // Weather. Game.GameWeatherManager.Instance.SetWeather(msg.currentWeather); // Vehicles. foreach (Messages.VehicleInitMessage vehicleMsg in msg.vehicles) { Vector3 pos = Utils.NetVec3ToGame(vehicleMsg.transform.position); Quaternion rot = Utils.NetQuatToGame(vehicleMsg.transform.rotation); NetVehicle vehicle = GetVehicle(vehicleMsg.id); Client.Assert(vehicle != null, $"Received info about non existing vehicle {vehicleMsg.id} in full world sync. (pos: {pos}, rot: {rot})"); vehicle.Teleport(pos, rot); } // Pickupables List <ushort> pickupablesIds = new List <ushort>(); foreach (var kv in netPickupables) { pickupablesIds.Add(kv.Key); } foreach (Messages.PickupableSpawnMessage pickupableMsg in msg.pickupables) { SpawnPickupable(pickupableMsg); pickupablesIds.Remove(pickupableMsg.id); } // Remove spawned (and active) pickupables that we did not get info about. foreach (ushort id in pickupablesIds) { GameObject gameObject = netPickupables[id].gameObject; if (gameObject && !gameObject.activeSelf) { continue; } DestroyPickupableLocal(id); } }
/// <summary> /// Write full world synchronization message. /// </summary> /// <param name="msg">The message to write to.</param> public void WriteFullWorldSync(Messages.FullWorldSyncMessage msg) { // Write time Game.GameWorld gameWorld = Game.GameWorld.Instance; msg.dayTime = gameWorld.WorldTime; msg.day = gameWorld.WorldDay; // Write mailbox name msg.mailboxName = gameWorld.PlayerLastName; // Write doors List <Game.Objects.GameDoor> doors = Game.GameDoorsManager.Instance.doors; int doorsCount = doors.Count; msg.doors = new Messages.DoorsInitMessage[doorsCount]; for (int i = 0; i < doorsCount; ++i) { var doorMsg = new Messages.DoorsInitMessage(); Game.Objects.GameDoor door = doors[i]; doorMsg.position = Utils.GameVec3ToNet(door.Position); doorMsg.open = door.IsOpen; msg.doors[i] = doorMsg; } // Write light switches. List <Game.Objects.LightSwitch> lights = Game.LightSwitchManager.Instance.lightSwitches; int lightCount = lights.Count; msg.lights = new Messages.LightSwitchMessage[lightCount]; for (int i = 0; i < lightCount; i++) { var lightMsg = new Messages.LightSwitchMessage(); Game.Objects.LightSwitch light = lights[i]; lightMsg.pos = Utils.GameVec3ToNet(light.Position); lightMsg.toggle = light.SwitchStatus; msg.lights[i] = lightMsg; } // Write weather Game.GameWeatherManager.Instance.WriteWeather(msg.currentWeather); // Write vehicles. int vehiclesCount = vehicles.Count; msg.vehicles = new Messages.VehicleInitMessage[vehiclesCount]; for (int i = 0; i < vehiclesCount; ++i) { var vehicleMsg = new Messages.VehicleInitMessage(); NetVehicle vehicle = vehicles[i]; vehicleMsg.id = vehicle.NetId; vehicleMsg.transform.position = Utils.GameVec3ToNet(vehicle.GetPosition()); vehicleMsg.transform.rotation = Utils.GameQuatToNet(vehicle.GetRotation()); msg.vehicles[i] = vehicleMsg; } // Write pickupables. var pickupableMessages = new List <Messages.PickupableSpawnMessage>(); foreach (var kv in netPickupables) { NetPickupable pickupable = kv.Value; if (pickupable.gameObject == null) { Logger.Log($"Null ptr of the pickupable game object {pickupable.NetId}"); continue; } var pickupableMsg = new Messages.PickupableSpawnMessage(); pickupableMsg.id = pickupable.NetId; var metaData = pickupable.gameObject.GetComponent <Game.Components.PickupableMetaDataComponent>(); pickupableMsg.prefabId = metaData.prefabId; Transform transform = pickupable.gameObject.transform; pickupableMsg.transform.position = Utils.GameVec3ToNet(transform.position); pickupableMsg.transform.rotation = Utils.GameQuatToNet(transform.rotation); pickupableMsg.active = pickupable.gameObject.activeSelf; List <float> data = new List <float>(); //Beercases if (metaData.PrefabDescriptor.type == Game.GamePickupableDatabase.PrefabType.BeerCase && pickupable.gameObject.name != "beer case") { Game.Objects.BeerCase beer = Game.BeerCaseManager.Instance.FindBeerCase(pickupable.gameObject); data.Add(Game.BeerCaseManager.Instance.FullCaseBottles - beer.UsedBottles); } if (data.Count != 0) { pickupableMsg.Data = data.ToArray(); } pickupableMessages.Add(pickupableMsg); } msg.pickupables = pickupableMessages.ToArray(); netManager.GetLocalPlayer().WriteSpawnState(msg); }
/// <summary> /// Write full world synchronization message. /// </summary> /// <param name="msg">The message to write to.</param> public void WriteFullWorldSync(Messages.FullWorldSyncMessage msg) { Logger.Debug("Writing full world synchronization message."); var watch = System.Diagnostics.Stopwatch.StartNew(); // 'Player is loading' is only applicable for remote client. playerIsLoading = false; // Write time Game.GameWorld gameWorld = Game.GameWorld.Instance; msg.dayTime = gameWorld.WorldTime; msg.day = gameWorld.WorldDay; // Write mailbox name msg.mailboxName = gameWorld.PlayerLastName; // Write doors List <GameDoor> doors = GameDoorsManager.Instance.doors; int doorsCount = doors.Count; msg.doors = new Messages.DoorsInitMessage[doorsCount]; Logger.Debug($"Writing state of {doorsCount} doors."); for (int i = 0; i < doorsCount; ++i) { var doorMsg = new Messages.DoorsInitMessage(); GameDoor door = doors[i]; doorMsg.position = Utils.GameVec3ToNet(door.Position); doorMsg.open = door.IsOpen; msg.doors[i] = doorMsg; } // Write light switches. List <LightSwitch> lights = Game.LightSwitchManager.Instance.lightSwitches; int lightCount = lights.Count; msg.lights = new Messages.LightSwitchMessage[lightCount]; Logger.Debug($"Writing light switches state of {lightCount}"); for (int i = 0; i < lightCount; i++) { var lightMsg = new Messages.LightSwitchMessage(); LightSwitch light = lights[i]; lightMsg.pos = Utils.GameVec3ToNet(light.Position); lightMsg.toggle = light.SwitchStatus; msg.lights[i] = lightMsg; } // Write weather GameWeatherManager.Instance.WriteWeather(msg.currentWeather); // Write objects. (Pickupables, Player vehicles, AI vehicles) var pickupableMessages = new List <Messages.PickupableSpawnMessage>(); Logger.Debug( $"Writing state of {ObjectSyncManager.Instance.ObjectIDs.Count} objects"); foreach (var kv in ObjectSyncManager.Instance.ObjectIDs) { ObjectSyncComponent osc = kv.Value; if (osc == null) { continue; } if (osc.ObjectType != ObjectSyncManager.ObjectTypes.Pickupable) { continue; } bool wasActive = true; if (!osc.gameObject.activeSelf) { wasActive = false; osc.gameObject.SetActive(true); } Logger.Log($"Writing object: {osc.gameObject.name}"); var pickupableMsg = new Messages.PickupableSpawnMessage(); var metaData = osc.gameObject.GetComponent <PickupableMetaDataComponent>(); Client.Assert(metaData != null && metaData.PrefabDescriptor != null, $"Object with broken meta data -- {osc.gameObject.name}."); pickupableMsg.prefabId = metaData.prefabId; Transform transform = osc.gameObject.transform; pickupableMsg.transform.position = Utils.GameVec3ToNet(transform.position); pickupableMsg.transform.rotation = Utils.GameQuatToNet(transform.rotation); pickupableMsg.active = osc.gameObject.activeSelf; // ObjectID pickupableMsg.id = osc.gameObject.GetComponent <ObjectSyncComponent>().ObjectID; List <float> data = new List <float>(); if (data.Count != 0) { pickupableMsg.Data = data.ToArray(); } if (!wasActive) { osc.gameObject.SetActive(false); } pickupableMessages.Add(pickupableMsg); } msg.pickupables = pickupableMessages.ToArray(); netManager.GetLocalPlayer().WriteSpawnState(msg); watch.Stop(); Logger.Debug( "World state has been written. Took " + watch.ElapsedMilliseconds + "ms"); }
/// <summary> /// Handle full world sync message. /// </summary> /// <param name="msg">The message to handle.</param> public void HandleFullWorldSync(Messages.FullWorldSyncMessage msg) { Logger.Debug("Handling full world synchronization message."); var watch = System.Diagnostics.Stopwatch.StartNew(); // Read time Game.GameWorld gameWorld = Game.GameWorld.Instance; gameWorld.WorldTime = msg.dayTime; gameWorld.WorldDay = msg.day; // Read mailbox name gameWorld.PlayerLastName = msg.mailboxName; // Doors. foreach (Messages.DoorsInitMessage door in msg.doors) { Vector3 position = Utils.NetVec3ToGame(door.position); Game.Objects.GameDoor doors = Game.GameDoorsManager.Instance.FindGameDoors(position); Client.Assert(doors != null, $"Unable to find doors at: {position}."); if (doors.IsOpen != door.open) { doors.Open(door.open); } } // Lights. foreach (Messages.LightSwitchMessage light in msg.lights) { Vector3 position = Utils.NetVec3ToGame(light.pos); Game.Objects.LightSwitch lights = Game.LightSwitchManager.Instance.FindLightSwitch(position); Client.Assert( lights != null, $"Unable to find light switch at: {position}."); if (lights.SwitchStatus != light.toggle) { lights.TurnOn(light.toggle); } } // Weather. GameWeatherManager.Instance.SetWeather(msg.currentWeather); // Pickupables foreach (Messages.PickupableSpawnMessage pickupableMsg in msg.pickupables) { SpawnPickupable(pickupableMsg); } // Remove spawned (and active) pickupables that we did not get info about. foreach (var kv in GamePickupableDatabase.Instance.Pickupables) { if (kv.Value.GetComponent <ObjectSyncComponent>() == null) { GameObject.Destroy(kv.Value); } } GamePickupableDatabase.Instance.Pickupables.Clear(); playerIsLoading = false; watch.Stop(); Logger.Debug("Full world synchronization message has been handled. Took " + watch.ElapsedMilliseconds + "ms"); }
/// <summary> /// Handle full world sync message. /// </summary> /// <param name="msg">The message to handle.</param> public void HandleFullWorldSync(Messages.FullWorldSyncMessage msg) { Logger.Debug("Handling full world synchronization message."); var watch = System.Diagnostics.Stopwatch.StartNew(); // Read time Game.GameWorld gameWorld = GameWorld.Instance; gameWorld.WorldTime = msg.dayTime; gameWorld.WorldDay = msg.day; // Read mailbox name gameWorld.PlayerLastName = msg.mailboxName; // Doors. foreach (Messages.DoorsInitMessage door in msg.doors) { Vector3 position = Utils.NetVec3ToGame(door.position); GameDoor doors = GameDoorsManager.Instance.FindGameDoors(position); Client.Assert(doors != null, $"Unable to find doors at: {position}."); if (doors.IsOpen != door.open) { doors.Open(door.open); } } // Lights. foreach (Messages.LightSwitchMessage light in msg.lights) { Vector3 position = Utils.NetVec3ToGame(light.pos); LightSwitch lights = LightSwitchManager.Instance.FindLightSwitch(position); Client.Assert(lights != null, $"Unable to find light switch at: {position}."); if (lights.SwitchStatus != light.toggle) { lights.TurnOn(light.toggle); } } // Pickupables foreach (Messages.PickupableSpawnMessage pickupableMsg in msg.pickupables) { SpawnPickupable(pickupableMsg); } // Remove spawned (and active) pickupables that we did not get info about. foreach (var kv in GamePickupableDatabase.Instance.Pickupables) { if (kv.Value.GetComponent <ObjectSyncComponent>() == null) { GameObject.Destroy(kv.Value); } } // Connected players. int i = 0; foreach (int newPlayerID in msg.connectedPlayers.playerIDs) { Steamworks.CSteamID localSteamID = Steamworks.SteamUser.GetSteamID(); Steamworks.CSteamID newPlayerSteamID = new Steamworks.CSteamID(msg.connectedPlayers.steamIDs[i]); // If player is not host or local player, setup new player. if (newPlayerSteamID != netManager.GetHostPlayer().SteamId&& newPlayerSteamID != localSteamID) { netManager.players.Add(newPlayerID, new NetPlayer(netManager, this, newPlayerSteamID)); netManager.players[newPlayerID].Spawn(); Logger.Debug("Setup new player at ID: " + newPlayerID); } i++; } // Object owners. foreach (Messages.ObjectOwnerSync syncMsg in msg.objectOwners) { if (syncMsg.ownerPlayerID != -1) { ObjectSyncManager.Instance.ObjectIDs[syncMsg.objectID].Owner = netManager.GetPlayerByPlayerID(syncMsg.ownerPlayerID); } } GamePickupableDatabase.Instance.Pickupables.Clear(); playerIsLoading = false; watch.Stop(); Logger.Debug("Full world synchronization message has been handled. Took " + watch.ElapsedMilliseconds + "ms"); }