//private TrainAudio trainAudio; //private BogieAudioController[] bogieAudios; #pragma warning disable IDE0051 // Remove unused private members private void Awake() { Main.Log($"NetworkTrainPosSync.Awake()"); trainCar = GetComponent <TrainCar>(); //bogieAudios = new BogieAudioController[trainCar.Bogies.Length]; Main.Log($"[{trainCar.ID}] NetworkTrainPosSync Awake called"); Main.Log($"Listening to derailment/rerail events"); trainCar.OnDerailed += TrainDerail; trainCar.OnRerailed += TrainRerail; localPlayer = SingletonBehaviour <NetworkPlayerManager> .Instance.GetLocalPlayerSync(); isStationary = trainCar.isStationary; Main.Log($"Listening to movement changed event"); trainCar.MovementStateChanged += TrainCar_MovementStateChanged; trainCar.CarDamage.CarEffectiveHealthStateUpdate += OnBodyDamageTaken; if (!trainCar.IsLoco) { trainCar.CargoDamage.CargoDamaged += OnCargoDamageTaken; } if (trainCar.carType == TrainCarType.LocoShunter) { shunterLocoSimulation = GetComponent <ShunterLocoSimulation>(); shunterExhaust = trainCar.transform.Find("[particles]").Find("ExhaustEngineSmoke").GetComponent <ParticleSystem>().main; } if (!trainCar.IsLoco) { trainCar.CargoLoaded += OnCargoLoaded; trainCar.CargoUnloaded += OnCargoUnloaded; } //for(int i = 0; i < trainCar.Bogies.Length; i++) //{ // bogieAudios[i] = trainCar.Bogies[i].GetComponent<BogieAudioController>(); //} if (NetworkManager.IsHost()) { trainCar.TrainsetChanged += TrainCar_TrainsetChanged; SetAuthority(true); } else { SetAuthority(false); } }
/// <summary> /// Gets the NetworkPlayerSync script of all non local players. /// </summary> /// <returns>Readonly list containing the NetworkPlayerSync script of all non local players</returns> internal IReadOnlyList <NetworkPlayerSync> GetAllNonLocalPlayerSync() { List <NetworkPlayerSync> networkPlayerSyncs = new List <NetworkPlayerSync>(); foreach (GameObject playerObject in networkPlayers.Values) { NetworkPlayerSync playerSync = playerObject.GetComponent <NetworkPlayerSync>(); if (playerSync != null) { networkPlayerSyncs.Add(playerSync); } } return(networkPlayerSyncs); }
private void UpdateNetworkPositionAndRotation(Message message) { using (DarkRiftReader reader = message.GetReader()) { while (reader.Position < reader.Length) { Location location = reader.ReadSerializable <Location>(); if (location.Id != SingletonBehaviour <UnityClient> .Instance.ID && networkPlayers.TryGetValue(location.Id, out GameObject playerObject)) { Vector3 pos = location.Position; pos = new Vector3(pos.x, pos.y + 1, pos.z); NetworkPlayerSync playerSync = playerObject.GetComponent <NetworkPlayerSync>(); playerSync.UpdateLocation(pos, location.AproxPing, location.UpdatedAt, location.Rotation); } } } }
private void SpawnNetworkPlayer(Message message) { using (DarkRiftReader reader = message.GetReader()) { while (reader.Position < reader.Length) { newPlayerConnecting = true; NPlayer player = reader.ReadSerializable <NPlayer>(); if (player.Id != SingletonBehaviour <UnityClient> .Instance.ID) { Location playerPos = reader.ReadSerializable <Location>(); Main.Log($"[CLIENT] < PLAYER_SPAWN: Username: {player.Username} "); Vector3 pos = playerPos.Position + WorldMover.currentMove; pos = new Vector3(pos.x, pos.y + 1, pos.z); Quaternion rotation = Quaternion.identity; if (playerPos.Rotation.HasValue) { rotation = playerPos.Rotation.Value; } GameObject playerObject = GetNewPlayerObject(pos, rotation, player.Username); WorldMover.Instance.AddObjectToMove(playerObject.transform); NetworkPlayerSync playerSync = playerObject.GetComponent <NetworkPlayerSync>(); playerSync.Id = player.Id; playerSync.Username = player.Username; playerSync.Mods = player.Mods; playerSync.IsLoaded = player.IsLoaded; networkPlayers.Add(player.Id, playerObject); allPlayers.Add(player.Id, playerObject); if (!player.IsLoaded) { WaitForPlayerLoaded(); } } } } }
private static void InitializeUnityScripts() { Main.Log($"[CLIENT] Initializing Player"); NetworkPlayerSync playerSync = PlayerManager.PlayerTransform.gameObject.AddComponent <NetworkPlayerSync>(); playerSync.IsLocal = true; playerSync.Username = username; playerSync.Id = client.ID; Main.Log($"[CLIENT] Initializing NetworkPlayerManager"); networkManager.AddComponent <NetworkPlayerManager>(); Main.Log($"[CLIENT] Initializing NetworkTrainManager"); networkManager.AddComponent <NetworkTrainManager>(); Main.Log($"[CLIENT] Initializing NetworkJunctionManager"); networkManager.AddComponent <NetworkJunctionManager>(); Main.Log($"[CLIENT] Initializing NetworkSaveGameManager"); networkManager.AddComponent <NetworkSaveGameManager>(); Main.Log($"[CLIENT] Initializing NetworkJobsManager"); networkManager.AddComponent <NetworkJobsManager>(); Main.Log($"[CLIENT] Initializing NetworkTurntableManager"); networkManager.AddComponent <NetworkTurntableManager>(); Main.Log($"[CLIENT] Initializing NetworkDebtManager"); networkManager.AddComponent <NetworkDebtManager>(); }
internal void CheckAuthorityChange() { if (!trainCar || trainCar.logicCar == null || !trainCar.IsLoco) { return; } try { // If not on turntable or no one is in control shed of turntable if (turntable == null || turntable != null && !turntable.IsAnyoneInControlArea) { bool authNeedsChange = false; GameObject newOwner = null; GameObject currentOwner; if (!hasLocalPlayerAuthority) { currentOwner = SingletonBehaviour <NetworkPlayerManager> .Instance.GetPlayerById(serverState.AuthorityPlayerId); } else { currentOwner = SingletonBehaviour <NetworkPlayerManager> .Instance.GetLocalPlayer(); } // Should force authority change if (!resetAuthority) { // Check if current owner is disconnected if (currentOwner) { // Get new owner that is valid newOwner = GetNewOwnerIfConditionsAreMet(currentOwner); authNeedsChange = newOwner is object; } else { // Give host authority if current client is disconnected newOwner = SingletonBehaviour <NetworkPlayerManager> .Instance.GetLocalPlayer(); authNeedsChange = true; } } else { // Force authority change authNeedsChange = true; // Use host as fallback if no one is in control newOwner = GetPlayerAuthorityReplacement(true); } // If authority needs to be changed if (authNeedsChange) { NetworkPlayerSync newOwnerPlayerData = newOwner.GetComponent <NetworkPlayerSync>(); bool shouldSendAuthChange = resetAuthority ? true : newOwnerPlayerData.Id != serverState.AuthorityPlayerId; // Check if the current authority is already given to the new owner if (newOwnerPlayerData.Id == serverState.AuthorityPlayerId && !shouldSendAuthChange) { // Check if all cars in the trainset have the correct authority shouldSendAuthChange = CheckTrainsetMismatchesAuthority(newOwnerPlayerData.Id); } // Check if authority still needs to be sent if (shouldSendAuthChange) { // Send authority change SingletonBehaviour <NetworkTrainManager> .Instance.SendAuthorityChange(trainCar.trainset, newOwnerPlayerData.Id); resetAuthority = false; } } else { // Set the new owner to current owner if (newOwner == null) { newOwner = currentOwner; } NetworkPlayerSync newOwnerPlayerData = newOwner.GetComponent <NetworkPlayerSync>(); // Send authority change if trainset mismatched if (CheckTrainsetMismatchesAuthority(newOwnerPlayerData.Id)) { SingletonBehaviour <NetworkTrainManager> .Instance.SendAuthorityChange(trainCar.trainset, newOwnerPlayerData.Id); } } } else { // Send authority change if on turntable based of turntable controller if (serverState.AuthorityPlayerId != turntable.playerAuthId) { SingletonBehaviour <NetworkTrainManager> .Instance.SendAuthorityChange(trainCar.trainset, turntable.playerAuthId); } } } catch (Exception ex) { Main.Log($"Exception thrown in authority check. {ex.Message}"); } }