IEnumerator Die(Transform attacker, CharacterAttacking charAttacking, Vector3 hitDir) { if(!IsEnemy) InputChange (false); _charMotor.GrabbedSetup(false); if(voiceDie) { if (deadPrefab == null) Manager_Audio.PlaySound(_myAudio, voiceDie, false); else AudioSource.PlayClipAtPoint(voiceDie, myTransform.position); } // Stop displaying our target cursor. Manager_Targeting.instance.DisableTargetCursors (PlayerNumber, _charAttacking); if (myDizzyParticle && _dizPartEmit && _dizPartEmit.emit) { _dizPartEmit.emit = false; Stunned = false; _stunAmount = 0; } gameObject.name += "Dead"; // Now Detection radius' won't find us. if(IsEnemy) { // This enemy is no longer a target. if(Manager_Targeting.instance.enemyTargets.Contains(this.transform)) Manager_Targeting.instance.enemyTargets.Remove(this.transform); } if(attacker != null) { // Setup for resetting attacker's combo and changing target for // anyone who has this character targeted since they are dead, // they shouldn't be targeted anymore. if(charAttacking == null) charAttacking = attacker.GetComponent<CharacterAttacking>(); if(charAttacking.StartedComboEnemy == myTransform) charAttacking.ComboChange(false); if(IsEnemy) { if(charAttacking.TargetedCharacter == myTransform) charAttacking.TargetChange(); if(Manager_Targeting.instance.playerTargets.Count > 1) { foreach(Transform player in Manager_Targeting.instance.playerTargets) { if(player != attacker) { CharacterAttacking pAttacking = player.GetComponent<CharacterAttacking>(); if(pAttacking.StartedComboEnemy == myTransform) pAttacking.ComboChange(false); if(pAttacking.TargetedCharacter == myTransform) pAttacking.TargetChange(); } } } } } // Additional height added from dying. hitDir.y = 3 + (hitDir.y * 2); if(IsEnemy) { // Get rid of our health bar and NavMeshAgent. Destroy (healthSlider.transform.parent.gameObject); Destroy (_characterAI.Agent.gameObject, 0.1f); _characterAI.enabled = false; // We are no longer needed in this list. Manager_Game.instance.enemiesAll.Remove(this.gameObject); } Transform myCamTarget = myTransform; if(deadPrefab != null) // A ragdoll is assigned. { // Create our ragdoll and give it velocity based on our hitDir. GameObject ragdoll = Instantiate(deadPrefab, myTransform.position, myTransform.rotation) as GameObject; Rigidbody ragRigid = ragdoll.GetComponentInChildren<Rigidbody>(); ragRigid.velocity = new Vector3(hitDir.x * 3, hitDir.y, hitDir.z * 3); if(IsEnemy) { // Our ragdoll is the dead enemy for us now. Manager_Game.instance.enemiesDead.Add(ragdoll); Destroy(this.gameObject); StopCoroutine("GotHit"); yield break; } else { // Make the cam switch its current target of this character with // the ragdoll. Use the one with the rigidbody on it. Camera_BEU.instance.ChangeTarget(myTransform, ragRigid.transform); myCamTarget = ragRigid.transform; // Make it so we can't be seen. foreach(SkinnedMeshRenderer skinMesh in mySkinnedMeshes) skinMesh.enabled = false; // We disable ourselves while the ragdoll is there. myRigidbody.isKinematic = true; GetComponent<Collider>().enabled = false; yield return new WaitForSeconds(4); if(playerLives > 1) // We can respawn. { // Change the cam back to us in place of our ragdoll. Camera_BEU.instance.ChangeTarget(ragRigid.transform, myTransform); Destroy (ragdoll); // No longer need the ragdoll. } } } else // Die using an animation. { if(IsEnemy && !Manager_Game.instance.enemiesDead.Contains(this.gameObject)) Manager_Game.instance.enemiesDead.Add(this.gameObject); } if(IsEnemy) _charAttacking.enabled = false; else { if(playerLives > 1) { if(deadPrefab == null) // Died using an animation. { yield return new WaitForSeconds(2.9f); // Dead time foreach(SkinnedMeshRenderer skinnedMesh in mySkinnedMeshes) skinnedMesh.enabled = false; yield return new WaitForSeconds(0.1f); } Respawn(); yield return new WaitForSeconds(1.5f); } else // No more lives left. { Manager_Game.instance.LiveChange(PlayerNumber, -1); // We are no longer an active player in the game... if(Manager_Targeting.instance.playerTargets.Contains(this.transform)) Manager_Targeting.instance.playerTargets.Remove(this.transform); Manager_Game.instance.allPlayerStatus.Remove(this); if(!Manager_Game.playersDefeated.Contains(this.gameObject)) Manager_Game.playersDefeated.Add(this.gameObject); // The Manager_UI will now not display our results at the end of // the stage, provided that another player makes it. if(PlayerNumber == 1) Manager_UI.ShowP1Results = false; else if(PlayerNumber == 2) Manager_UI.ShowP2Results = false; else if(PlayerNumber == 3) Manager_UI.ShowP3Results = false; else if(PlayerNumber == 4) Manager_UI.ShowP4Results = false; // The camera doesn't need to target us anymore. Camera_BEU.instance.targets.Remove(this.transform); if(Manager_Game.playersDefeated.Count == Manager_Game.NumberOfPlayers) { // Game Over! Manager_Game.instance.Invoke("GameOver", 1); } else // Other players remain. { // Wait until the battle ends. while(Manager_BattleZone.instance.InBattle) yield return 0; Camera_BEU.instance.RemoveTarget(myCamTarget); // Next is where we control an AI player who may still // be active in the game using our controls while keeping // their player number. foreach(Transform player in Manager_Targeting.instance.playerTargets) { if(player) { CharacterStatus cStatus = player.GetComponent<CharacterStatus>(); if(cStatus.AIOn) { if(player == Manager_Targeting.instance.playerTargets[0]) cStatus.InputChange(true, true, PlayerNumber); cStatus.SendMessage("FindLeadPlayer"); } } } // We will flash away and then be deactivated if we do not have a ragdoll if(!deadPrefab) StartFlash(0.2f, 0.6f, 3, FlashType.Renderer_Disable); } } } StopCoroutine ("Die"); }