Ejemplo n.º 1
0
        /// <summary>
        /// Callback method for when a player leaves our scene.
        /// </summary>
        /// <param name="data">The generic client packet data.</param>
        private void OnPlayerLeaveScene(GenericClientData data)
        {
            var id = data.Id;

            Logger.Get().Info(this, $"Player {id} left scene");

            if (!_playerData.TryGetValue(id, out var playerData))
            {
                Logger.Get().Warn(this, $"Could not find player data for player with ID {id}");
                return;
            }

            // Recycle corresponding player
            _playerManager.RecyclePlayer(id);

            playerData.IsInLocalScene = false;
            foreach (Transform child in playerData.PlayerObject.transform)
            {
                foreach (Transform grandChild in child)
                {
                    Object.Destroy(grandChild.gameObject);
                }
            }

            try {
                PlayerLeaveSceneEvent?.Invoke(playerData);
            } catch (Exception e) {
                Logger.Get().Warn(this,
                                  $"Exception thrown while invoking PlayerLeaveScene event, {e.GetType()}, {e.Message}, {e.StackTrace}");
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Callback method for when a player leaves a scene.
        /// </summary>
        /// <param name="id">The ID of the player.</param>
        private void OnClientLeaveScene(ushort id)
        {
            if (!_playerData.TryGetValue(id, out var playerData))
            {
                Logger.Get().Warn(this, $"Received LeaveScene data from {id}, but player is not in mapping");
                return;
            }

            var sceneName = playerData.CurrentScene;

            if (sceneName.Length == 0)
            {
                Logger.Get().Info(this,
                                  $"Received LeaveScene data from ID {id}, but there was no last scene registered");
                return;
            }

            Logger.Get().Info(this, $"Received LeaveScene data from ID {id}, last scene: {sceneName}");

            playerData.CurrentScene = "";

            foreach (var idPlayerDataPair in _playerData.GetCopy())
            {
                // Skip source player
                if (idPlayerDataPair.Key == id)
                {
                    continue;
                }

                var otherPlayerData = idPlayerDataPair.Value;

                // Send the packet to all clients on the scene that the player left
                // to indicate that this client has left their scene
                if (otherPlayerData.CurrentScene.Equals(sceneName))
                {
                    Logger.Get().Info(this, $"Sending leave scene packet to {idPlayerDataPair.Key}");

                    _netServer.GetUpdateManagerForClient(idPlayerDataPair.Key)?.AddPlayerLeaveSceneData(id);
                }
            }

            try {
                PlayerLeaveSceneEvent?.Invoke(playerData);
            } catch (Exception e) {
                Logger.Get().Warn(this, $"Exception thrown while invoking PlayerLeaveScene event, {e.GetType()}, {e.Message}, {e.StackTrace}");
            }
        }