/// <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}"); } }
/// <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); } }
/// <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}"); } }
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; } }
/// <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)) ); }
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)) ); }