Advertisement
Guest User

Untitled

a guest
Dec 11th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 18.36 KB | None | 0 0
  1. public void TakeDamage(Bullet bullet, float modifier = 1f)
  2.         {
  3.             // засвечиваем игрока в кустах, если мы по нему попали
  4.             TankVisibilityController.I.HandleShot(this);
  5.  
  6.             // NOTE: расчет дамага теперь происходит на только на мастере.
  7.             if (isAegisActive || IsRespawnShieldActive || IsGodMode)
  8.             {
  9.                 return;
  10.             }
  11.  
  12.             Player other = bullet.Owner;
  13.             if (other._isDamageMultiplierActive)
  14.             {
  15.                 modifier *= AbilitySettings.Get<PowerupAbilitySettings>(AbilityType.DamageMultiplier).Multiplier;
  16.             }
  17.  
  18.             if (_isShieldActive)
  19.             {
  20.                 modifier *= AbilitySettings.Get<PowerupAbilitySettings>(AbilityType.Shield).Multiplier;
  21.             }
  22.  
  23.             if (modifier.AlmostEquals(0f))
  24.                 return;
  25.  
  26.             //store network variables temporary
  27.             int health = GetHealth();
  28.  
  29.             //как бы тут ассисты элегантнее сделать?
  30.  
  31.             int dmg = (int)(bullet.GetDamage() * modifier);
  32.  
  33.             if (dmg < 1)
  34.             {
  35.                 dmg = 1;
  36.             }
  37.  
  38.  
  39.             dmg = Math.Min(dmg, health);
  40.  
  41.             // если выстрел был обычной пулей (не ультой), засчитываем нанесённый дамаг в счет кулдауна абилки.
  42.             if (!other.IsOwnedByOtherPlayer && bullet.Config == other.TurretConfig && other.abilityCooldownDamageRemaining > 0)
  43.             {
  44.                 other.abilityCooldownDamageRemaining -= dmg;
  45.  
  46.                 if (other.abilityCooldownDamageRemaining <= 0)
  47.                 {
  48.                     other.abilityCooldownDamageRemaining = 0;
  49.                     other.UpdateActiveAbilityIndicators();
  50.                 }
  51.             }
  52.  
  53.             if (other.IsOwnedByOtherPlayer)
  54.             {
  55.                 // если убийство совершает бот, владельцем которого является другой игрок (мина-паук или туррель),
  56.                 // фраг должен зачислится владельцу.
  57.                 var ownerPlayer = ActivePlayers.FirstOrDefault(pl => pl.UserId == other.bot.OwnerUserId);
  58.                 if (ownerPlayer != null)
  59.                     other = ownerPlayer;
  60.                 else
  61.                     Debug.LogErrorFormat("TakeDamage: Bot owner not found {0}", other.bot.OwnerUserId);
  62.             }
  63.  
  64.             assistCandidates[other] = Time.realtimeSinceStartup;
  65.  
  66.             //todo закомментил vadim
  67.             //if (!PhotonNetwork.isMasterClient)
  68.             //{
  69.             //    // остальная логика - только на мастере.
  70.             //    return;
  71.             //}
  72.  
  73.  
  74.             //Debug.Log("take dmg " + Time.time + ", hp: " + health + ", dmg: " + the_dmg);
  75.  
  76.             //substract health by damage
  77.             //locally for now, to only have one update later on
  78.  
  79.             if (!bullet.Owner.photonView.isMine)
  80.                 return;
  81.            
  82.             health -= dmg;
  83.            
  84.            
  85.  
  86.             //bullet killed the player
  87.             if (health <= 0)
  88.             {              
  89.                 //the game is already over so don't do anything
  90.                 if (GameManager.IsGameOver())
  91.                     return;
  92.  
  93.                 //movo to rpc explode
  94.  
  95.                 //get killer and increase score for that team
  96.                 /*
  97.                 int otherTeam = other.GetTeamIndex();
  98.  
  99.  
  100.                 SpawnedEnemy en = gameObject.GetComponent<SpawnedEnemy>();
  101.                 if (en != null)
  102.                 {
  103.                     en.Dead();
  104.                 }*/
  105.  
  106.                 Debug.Log("Health < 0 ");
  107.                 //tell all clients to despawn this player                
  108.                 CmdExplode(other);
  109.  
  110.                 /*
  111.                 // если убитый игрок является миной-пауком или туррелью, на статистику боя это никак не влияет.
  112.                 if (!IsOwnedByOtherPlayer)
  113.                 {
  114.                     IncreaseDeaths();
  115.  
  116.                     int kills = other.IncreaseKills();
  117.  
  118.                     float assistTimeThreshold = Time.realtimeSinceStartup - CommonBalance.Data.AssistTimeout;
  119.                     foreach (var pair in assistCandidates)
  120.                     {
  121.                         var assistedPlayer = pair.Key;
  122.  
  123.                         // убившему игроку не начисляется ассист, ему начисляется kill                    
  124.                         if (assistedPlayer != null && assistedPlayer != other && pair.Value > assistTimeThreshold)
  125.                         {
  126.                             assistedPlayer.IncreaseAssists();
  127.                             assistedPlayer.photonView.RPC("AddAchievement", assistedPlayer.photonView.owner, Achievement.Assist);
  128.                         }
  129.                     }
  130.  
  131.                     assistCandidates.Clear();
  132.  
  133.                     int killsInARow;
  134.                     if (Time.realtimeSinceStartup - other.lastKillTime < CommonBalance.Data.KillInARowTimeout)
  135.                     {
  136.                         killsInARow = other.IncreaseKillsInARow();
  137.                     }
  138.                     else
  139.                     {
  140.                         killsInARow = 1;
  141.                         other.SetKillsInARow(killsInARow);
  142.                     }
  143.  
  144.                     other.lastKillTime = Time.realtimeSinceStartup;
  145.                     other.photonView.RPC("AddAchievement", other.photonView.owner, GetKillAchievement(killsInARow));
  146.  
  147.                     if (NetworkManager.Instance.BattleType == BattleType.Domination)
  148.                     {
  149.                         // если умерла вся команда, то обновляем счет. Это может привести к Game Over или переходу в следующий раунд
  150.                         // (см. NetworkManager.OnPhotonCustomRoomPropertiesChanged)
  151.                         int myTeamIndex = GetTeamIndex();
  152.  
  153.                         if (!ActivePlayers.Any(pl => pl.IsAlive && pl.GetTeamIndex() == myTeamIndex))
  154.                             RoomManager.AddScore(otherTeam);
  155.                     }
  156.                     else if (NetworkManager.Instance.BattleType == BattleType.TeamDeathMatch || NetworkManager.Instance.BattleType == BattleType.Clash ||
  157.                         NetworkManager.Instance.BattleType == BattleType.TutorialBasic || NetworkManager.Instance.BattleType == BattleType.TutorialSecondary)
  158.                     {
  159.                         RoomManager.AddScore(otherTeam);
  160.                     }
  161.                     else if (NetworkManager.Instance.BattleType == BattleType.Bounty)
  162.                     {
  163.                         // забираем звёздочки убитого
  164.                         int resources = GetResourceCount();
  165.                         if (resources != 0)
  166.                             SetResourceCount(0);
  167.  
  168.                         // если убийца жив (может быть мёртв, если это его мина или туррель), добавляем ему одну звёздочку за килл
  169.                         if (other.IsAlive && other.GetResourceCount() < CommonBalance.Data.BountyMaxPlayerResources)
  170.                             other.IncreaseResourceCount();
  171.  
  172.                         // добавляем вражеской команде в счет звёздочки убитого
  173.                         RoomManager.AddScore(otherTeam, (resources + 1));
  174.                     }
  175.                     else if (NetworkManager.Instance.BattleType == BattleType.GrabResource)
  176.                     {
  177.                         // рассыпаем ресурсы, принадлежавшие погибшему игроку
  178.                         int resources = GetResourceCount();
  179.  
  180.                         if (resources > 0)
  181.                         {
  182.                             SetResourceCount(0);
  183.                             GameManager.GetInstance().DestroyedTankResourceSpawner.CmdInstantiateAroundPosition(transform.position, 4f, resources);
  184.                         }
  185.  
  186.                         NetworkManager.Instance.RefreshCountdownState();
  187.                     }
  188.                 } */
  189.             }
  190.             else
  191.             {
  192.                 //we didn't die, set health to new value
  193.                 SetHealth(health);
  194.  
  195.                 // на случай, если в одном кадре мы словили 2 пули (у нас стало < 20% хп, вторую пулю мы должны подавить щитом)
  196.                 if (PassiveAbility == AbilityType.Aegis)
  197.                 {
  198.                     CheckAegis();
  199.                 }
  200.  
  201.                 if (IsBot())
  202.                     bot.OnDamageTaken(bullet);
  203.  
  204.                 Damaged(this);
  205.             }
  206.         }
  207.  
  208.  
  209.  
  210. -----
  211.  
  212.  public void CmdExplode(Player killedBy)
  213.         {
  214.             photonView.RPC("RpcExplode", PhotonTargets.All, killedBy.UserId);
  215.             /* if (PhotonNetwork.isMaster        
  216.              
  217.                 photonView.RPC("RpcExplode", PhotonTargets.All, killedBy.UserId);
  218.             }
  219.             else
  220.             {
  221.                 Debug.LogError("CmdExplode: trying to call on non-master");
  222.             } */
  223.         }
  224.  
  225.         //called on all clients on player death
  226.         [PunRPC]
  227.         protected virtual void RpcExplode(int killedByUserId)
  228.         {
  229.             Player killedBy = Player.ActivePlayers.FirstOrDefault(pl => pl.UserId == killedByUserId);
  230.            
  231.             if (PhotonNetwork.isMasterClient)
  232.             {
  233.                 SpawnedEnemy en = gameObject.GetComponent<SpawnedEnemy>();
  234.                 if (en != null)
  235.                 {
  236.                     en.Dead();
  237.                 }
  238.  
  239.                 int otherTeam = killedBy.GetTeamIndex();
  240.  
  241.  
  242.                 // если убитый игрок является миной-пауком или туррелью, на статистику боя это никак не влияет.
  243.                 if (!IsOwnedByOtherPlayer)
  244.                 {
  245.                     IncreaseDeaths();
  246.  
  247.                     int kills = killedBy.IncreaseKills();
  248.  
  249.                     float assistTimeThreshold = Time.realtimeSinceStartup - CommonBalance.Data.AssistTimeout;
  250.                     foreach (var pair in assistCandidates)
  251.                     {
  252.                         var assistedPlayer = pair.Key;
  253.  
  254.                         // убившему игроку не начисляется ассист, ему начисляется kill                    
  255.                         if (assistedPlayer != null && assistedPlayer != killedBy && pair.Value > assistTimeThreshold)
  256.                         {
  257.                             assistedPlayer.IncreaseAssists();
  258.                             assistedPlayer.photonView.RPC("AddAchievement", assistedPlayer.photonView.owner, Achievement.Assist);
  259.                         }
  260.                     }
  261.  
  262.                     assistCandidates.Clear();
  263.  
  264.                     int killsInARow;
  265.                     if (Time.realtimeSinceStartup - killedBy.lastKillTime < CommonBalance.Data.KillInARowTimeout)
  266.                     {
  267.                         killsInARow = killedBy.IncreaseKillsInARow();
  268.                     }
  269.                     else
  270.                     {
  271.                         killsInARow = 1;
  272.                         killedBy.SetKillsInARow(killsInARow);
  273.                     }
  274.  
  275.                     killedBy.lastKillTime = Time.realtimeSinceStartup;
  276.                     killedBy.photonView.RPC("AddAchievement", killedBy.photonView.owner, GetKillAchievement(killsInARow));
  277.  
  278.                     if (NetworkManager.Instance.BattleType == BattleType.Domination)
  279.                     {
  280.                         // если умерла вся команда, то обновляем счет. Это может привести к Game Over или переходу в следующий раунд
  281.                         // (см. NetworkManager.OnPhotonCustomRoomPropertiesChanged)
  282.                         int myTeamIndex = GetTeamIndex();
  283.  
  284.                         if (!ActivePlayers.Any(pl => pl.IsAlive && pl.GetTeamIndex() == myTeamIndex))
  285.                             RoomManager.AddScore(otherTeam);
  286.                     }
  287.                     else if (NetworkManager.Instance.BattleType == BattleType.TeamDeathMatch || NetworkManager.Instance.BattleType == BattleType.Clash ||
  288.                         NetworkManager.Instance.BattleType == BattleType.TutorialBasic || NetworkManager.Instance.BattleType == BattleType.TutorialSecondary)
  289.                     {
  290.                         RoomManager.AddScore(otherTeam);
  291.                     }
  292.                     else if (NetworkManager.Instance.BattleType == BattleType.Bounty)
  293.                     {
  294.                         // забираем звёздочки убитого
  295.                         int resources = GetResourceCount();
  296.                         if (resources != 0)
  297.                             SetResourceCount(0);
  298.  
  299.                         // если убийца жив (может быть мёртв, если это его мина или туррель), добавляем ему одну звёздочку за килл
  300.                         if (killedBy.IsAlive && killedBy.GetResourceCount() < CommonBalance.Data.BountyMaxPlayerResources)
  301.                             killedBy.IncreaseResourceCount();
  302.  
  303.                         // добавляем вражеской команде в счет звёздочки убитого
  304.                         RoomManager.AddScore(otherTeam, (resources + 1));
  305.                     }
  306.                     else if (NetworkManager.Instance.BattleType == BattleType.GrabResource)
  307.                     {
  308.                         // рассыпаем ресурсы, принадлежавшие погибшему игроку
  309.                         int resources = GetResourceCount();
  310.  
  311.                         if (resources > 0)
  312.                         {
  313.                             SetResourceCount(0);
  314.                             GameManager.GetInstance().DestroyedTankResourceSpawner.CmdInstantiateAroundPosition(transform.position, 4f, resources);
  315.                         }
  316.  
  317.                         NetworkManager.Instance.RefreshCountdownState();
  318.                     }
  319.                 }
  320.             }
  321.             StopAllCoroutines();
  322.  
  323.             _tankHolder.AfterExplode();
  324.  
  325.            
  326.             if (killedBy == null)
  327.                 Debug.LogErrorFormat("RpcExplode: Killed by not found {0}", killedByUserId);
  328.  
  329.             IsAlive = false;
  330.             OnActivePlayersChanged();
  331.             Exploded(this, killedBy);
  332.             ToggleNitro(false);
  333.  
  334.             //if (_tankHolder.TurretPart.Type == TankPartType.FlamethrowerTurret)
  335.             //{
  336.             //    _tankHolder.TurretPart.SetDotEmitterPsState(false);
  337.             //}
  338.  
  339.             shootCoroutine = null;
  340.  
  341.             int team_id = GetTeamIndex();
  342.  
  343.             Quaternion target_rot = Quaternion.Euler(0, myTransform.eulerAngles.y, 0);
  344.  
  345.             if (Holder.ChassisPart.Corpse != null)
  346.                 MeatDestruction.Instance.ExplodeTankParts(last_hit_dir, Holder.ChassisPart.Corpse, myTransform.position, target_rot, team_id);
  347.             if (Holder.TurretPart.Corpse != null)
  348.                 MeatDestruction.Instance.ExplodeTankParts(last_hit_dir, Holder.TurretPart.Corpse, myTransform.position + Vector3.up * 1, target_rot, team_id);
  349.  
  350.             if (IsMe)
  351.             {
  352.                 //reset input left over
  353.                 ResetControls();
  354.  
  355.                 TankCameraController.Instance.ShakeYourBody();
  356.  
  357.                 if (PassiveAbility == AbilityType.Kamikaze)
  358.                 {
  359.                     DeployKamikazeCharge();
  360.                 }
  361.             }
  362.  
  363.             if (HasPilot)
  364.             {
  365.                 MeatDestruction.Instance.ThrowPilot(myTransform.forward, new Vector3(myTransform.position.x, 0.1f, myTransform.position.z),
  366.                     Quaternion.Euler(0, Random.Range(0f, 359f), 0), team_id);
  367.             }
  368.  
  369.             Vector3 blood_pos = new Vector3(myTransform.position.x, 0.0f, myTransform.position.z);
  370.             GameManager.GetInstance().AddTimeSlice(MeatDestruction.Instance.blood_decals[0], blood_pos, target_rot);//, 1f, null, null, true);
  371.  
  372.             // проверяем IsVisible до ToggleTank, т.к. оно сразу станет false
  373.             if (IsVisible)
  374.             {
  375.                 if (_tankHolder.TurretPart.ExplosionFX != null)
  376.                 {
  377.                     GameManager.GetInstance().AddTimeSlice(_tankHolder.TurretPart.ExplosionFX, myTransform.position, myTransform.rotation);
  378.                 }
  379.             }
  380.  
  381.             ToggleTank(false);
  382.  
  383.             //play sound clip on player death
  384.             AudioManager.Play3D(SoundType.TankDestroyed, myTransform.position);
  385.  
  386.             UpdateTrackTrailState();
  387.  
  388.             if (IsBot())
  389.                 bot.OnExplode();
  390.  
  391.             float respawnTime = CommonBalance.GetBattleRespawnTime(NetworkManager.Instance.BattleType);
  392.             if (respawnTime > 0f && !IsOwnedByOtherPlayer)
  393.             {
  394.                 // NOTE: запускаем корутину на GameManager, т.к. текущий Player выключен.
  395.                 // Корутина запускается в том числе на не-мастерах, т.к. пока закончится её таймер, мастер может смениться.
  396.                 StartRespawnOnTimer(respawnTime);
  397.             }
  398.  
  399.             if (!IsMe)
  400.                 return;
  401.  
  402.             // перемещаем танк на позицию его будущего спавна, после того, как камера показала его смерть
  403.             // иначе во время респавна, танк появится на месте смерти для постороннего наблюдателя.
  404.             //GameManager.GetInstance().InvokeWithDelay(TankCameraController.Instance.DeathCameraRetargetPause + 0.1f, ResetPositionAfterExplode);
  405.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement