コード例 #1
0
        /// <summary>
        /// Callback method for when another player enters our scene.
        /// </summary>
        /// <param name="enterSceneData">The ClientPlayerEnterScene packet data.</param>
        private void OnPlayerEnterScene(ClientPlayerEnterScene enterSceneData)
        {
            // Read ID from player data
            var id = enterSceneData.Id;

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

            if (!_playerData.TryGetValue(id, out var playerData))
            {
                playerData      = new ClientPlayerData(id, enterSceneData.Username);
                _playerData[id] = playerData;
            }

            playerData.IsInLocalScene = true;

            _playerManager.SpawnPlayer(
                playerData,
                enterSceneData.Username,
                enterSceneData.Position,
                enterSceneData.Scale,
                enterSceneData.Team,
                enterSceneData.SkinId
                );
            _animationManager.UpdatePlayerAnimation(id, enterSceneData.AnimationClipId, 0);

            try {
                PlayerEnterSceneEvent?.Invoke(playerData);
            } catch (Exception e) {
                Logger.Get().Warn(this,
                                  $"Exception thrown while invoking PlayerEnterScene event, {e.GetType()}, {e.Message}, {e.StackTrace}");
            }
        }
コード例 #2
0
        /// <summary>
        /// Callback method for when we receive the HelloClient data.
        /// </summary>
        /// <param name="helloClient">The HelloClient packet data.</param>
        private void OnHelloClient(HelloClient helloClient)
        {
            Logger.Get().Info(this, "Received HelloClient from server");

            // Fill the player data dictionary with the info from the packet
            foreach (var(id, username) in helloClient.ClientInfo)
            {
                _playerData[id] = new ClientPlayerData(id, username);
            }
        }
コード例 #3
0
        /// <summary>
        /// Callback method for when a player connects to the server.
        /// </summary>
        /// <param name="playerConnect">The PlayerConnect packet data.</param>
        private void OnPlayerConnect(PlayerConnect playerConnect)
        {
            Logger.Get().Info(this, $"Received PlayerConnect data for ID: {playerConnect.Id}");

            var playerData = new ClientPlayerData(playerConnect.Id, playerConnect.Username);

            _playerData[playerConnect.Id] = playerData;

            UiManager.InternalChatBox.AddMessage($"Player '{playerConnect.Username}' connected to the server");

            try {
                PlayerConnectEvent?.Invoke(playerData);
            } catch (Exception e) {
                Logger.Get().Warn(this,
                                  $"Exception thrown while invoking PlayerConnect event, {e.GetType()}, {e.Message}, {e.StackTrace}");
            }
        }
コード例 #4
0
ファイル: PlayerManager.cs プロジェクト: jngo102/HKMP
        private void ToggleBodyDamage(ClientPlayerData playerData, bool enabled)
        {
            var playerObject = playerData.PlayerObject;

            // We need to move the player object to the correct layer so it can interact with nail swings etc.
            // Also toggle the enabled state of the DamageHero component
            if (enabled)
            {
                playerObject.layer = 11;
                playerObject.GetComponent <DamageHero>().enabled = true;
            }
            else
            {
                playerObject.layer = 9;
                playerObject.GetComponent <DamageHero>().enabled = false;
            }
        }
コード例 #5
0
        /// <summary>
        /// Spawn a new player object with the given data.
        /// </summary>
        /// <param name="playerData">The client player data for the player.</param>
        /// <param name="name">The username of the player.</param>
        /// <param name="position">The Vector2 denoting the position of the player.</param>
        /// <param name="scale">The boolean representing the scale of the player.</param>
        /// <param name="team">The team the player is on.</param>
        /// <param name="skinId">The ID of the skin the player is using.</param>
        public void SpawnPlayer(
            ClientPlayerData playerData,
            string name,
            Vector2 position,
            bool scale,
            Team team,
            byte skinId
            )
        {
            GameObject playerContainer;

            if (_inactivePlayers.Count <= 0)
            {
                // Create a new player container
                playerContainer = Object.Instantiate(_playerContainerPrefab);
                Object.DontDestroyOnLoad(playerContainer);
            }
            else
            {
                // Dequeue a player container from the inactive players
                playerContainer = _inactivePlayers.Dequeue();
            }

            playerContainer.name = $"Player Container {playerData.Id}";

            _activePlayers[playerData.Id] = playerContainer;

            playerContainer.transform.SetPosition2D(position.X, position.Y);

            var playerObject = playerContainer.FindGameObjectInChildren("PlayerPrefab");

            SetPlayerObjectBoolScale(playerObject, scale);

            // Set container and children active
            playerContainer.SetActive(true);
            playerContainer.SetActiveChildren(true);

            // Disable DamageHero component unless pvp is enabled
            if (_gameSettings.IsPvpEnabled && _gameSettings.IsBodyDamageEnabled)
            {
                playerObject.layer = 11;
                playerObject.GetComponent <DamageHero>().enabled = true;
            }
            else
            {
                playerObject.layer = 9;
                playerObject.GetComponent <DamageHero>().enabled = false;
            }

            AddNameToPlayer(playerContainer, name, team);

            // Let the SkinManager update the skin
            _skinManager.UpdatePlayerSkin(playerObject, skinId);

            // Store the player data
            playerData.PlayerContainer = playerContainer;
            playerData.PlayerObject    = playerObject;
            playerData.Team            = team;
            playerData.SkinId          = skinId;

            // Set whether this player should have body damage
            // Only if:
            // PvP is enabled and body damage is enabled AND
            // (the teams are not equal or if either doesn't have a team)
            ToggleBodyDamage(
                playerData,
                _gameSettings.IsPvpEnabled && _gameSettings.IsBodyDamageEnabled &&
                (team != LocalPlayerTeam ||
                 team.Equals(Team.None) ||
                 LocalPlayerTeam.Equals(Team.None))
                );
        }
コード例 #6
0
ファイル: PlayerManager.cs プロジェクト: jngo102/HKMP
        public void SpawnPlayer(
            ushort id,
            string name,
            Math.Vector2 position,
            bool scale,
            Team team,
            byte skinId
            )
        {
            if (_playerData.ContainsKey(id))
            {
                Logger.Get().Warn(this, $"We already have created a player object for ID {id}");
                return;
            }

            // Create a player container
            var playerContainer = new GameObject($"Player Container {id}");

            playerContainer.transform.position = new Vector3(position.X, position.Y);

            playerContainer.AddComponent <PositionInterpolation>();

            // Instantiate the player object from the prefab in the player container
            var playerObject = Object.Instantiate(
                _playerPrefab,
                playerContainer.transform
                );

            Object.DontDestroyOnLoad(playerObject);

            SetPlayerObjectBoolScale(playerObject, scale);

            // Set object and children to active
            playerObject.SetActive(true);
            playerObject.SetActiveChildren(true);

            // Now we need to copy over a lot of variables from the local player object
            var localPlayerObject = HeroController.instance.gameObject;

            // Obtain colliders from both objects
            var collider      = playerObject.GetComponent <BoxCollider2D>();
            var localCollider = localPlayerObject.GetComponent <BoxCollider2D>();

            // Copy collider offset and size
            collider.isTrigger = true;
            collider.offset    = localCollider.offset;
            collider.size      = localCollider.size;
            collider.enabled   = true;

            // Copy collider bounds
            var bounds      = collider.bounds;
            var localBounds = localCollider.bounds;

            bounds.min = localBounds.min;
            bounds.max = localBounds.max;

            // Disable DamageHero component unless pvp is enabled
            if (_gameSettings.IsPvpEnabled && _gameSettings.IsBodyDamageEnabled)
            {
                playerObject.layer = 11;
                playerObject.GetComponent <DamageHero>().enabled = true;
            }
            else
            {
                playerObject.layer = 9;
                playerObject.GetComponent <DamageHero>().enabled = false;
            }

            // Copy over mesh filter variables
            var meshFilter = playerObject.GetComponent <MeshFilter>();
            var mesh       = meshFilter.mesh;
            var localMesh  = localPlayerObject.GetComponent <MeshFilter>().sharedMesh;

            mesh.vertices  = localMesh.vertices;
            mesh.normals   = localMesh.normals;
            mesh.uv        = localMesh.uv;
            mesh.triangles = localMesh.triangles;
            mesh.tangents  = localMesh.tangents;

            // Copy mesh renderer material
            var meshRenderer = playerObject.GetComponent <MeshRenderer>();

            meshRenderer.material = new Material(localPlayerObject.GetComponent <MeshRenderer>().material);

            // Disable non bouncer component
            var nonBouncer = playerObject.GetComponent <NonBouncer>();

            nonBouncer.active = false;

            // Copy over animation library
            var spriteAnimator = playerObject.GetComponent <tk2dSpriteAnimator>();

            // Make a smart copy of the sprite animator library so we can
            // modify the animator without having to worry about other player objects
            spriteAnimator.Library = CopyUtil.SmartCopySpriteAnimation(
                localPlayerObject.GetComponent <tk2dSpriteAnimator>().Library,
                playerObject
                );

            AddNameToPlayer(playerContainer, name, team);

            // Let the SkinManager update the skin
            _skinManager.UpdatePlayerSkin(playerObject, skinId);

            // Store the player data in the mapping
            _playerData[id] = new ClientPlayerData(
                playerContainer,
                playerObject,
                team
                );

            // Set whether this player should have body damage
            // Only if:
            // PvP is enabled and body damage is enabled AND
            // (the teams are not equal or if either doesn't have a team)
            ToggleBodyDamage(
                _playerData[id],
                _gameSettings.IsPvpEnabled && _gameSettings.IsBodyDamageEnabled &&
                (team != LocalPlayerTeam ||
                 team.Equals(Team.None) ||
                 LocalPlayerTeam.Equals(Team.None))
                );
        }