//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);
        }
    }
Esempio n. 2
0
    /// <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);
    }
Esempio n. 3
0
    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);
                }
            }
        }
    }
Esempio n. 4
0
    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();
                    }
                }
            }
        }
    }
Esempio n. 5
0
        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}");
        }
    }