Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public void TakeDamage(Bullet bullet, float modifier = 1f)
- {
- // засвечиваем игрока в кустах, если мы по нему попали
- TankVisibilityController.I.HandleShot(this);
- // NOTE: расчет дамага теперь происходит на только на мастере.
- if (isAegisActive || IsRespawnShieldActive || IsGodMode)
- {
- return;
- }
- Player other = bullet.Owner;
- if (other._isDamageMultiplierActive)
- {
- modifier *= AbilitySettings.Get<PowerupAbilitySettings>(AbilityType.DamageMultiplier).Multiplier;
- }
- if (_isShieldActive)
- {
- modifier *= AbilitySettings.Get<PowerupAbilitySettings>(AbilityType.Shield).Multiplier;
- }
- if (modifier.AlmostEquals(0f))
- return;
- //store network variables temporary
- int health = GetHealth();
- //как бы тут ассисты элегантнее сделать?
- int dmg = (int)(bullet.GetDamage() * modifier);
- if (dmg < 1)
- {
- dmg = 1;
- }
- dmg = Math.Min(dmg, health);
- // если выстрел был обычной пулей (не ультой), засчитываем нанесённый дамаг в счет кулдауна абилки.
- if (!other.IsOwnedByOtherPlayer && bullet.Config == other.TurretConfig && other.abilityCooldownDamageRemaining > 0)
- {
- other.abilityCooldownDamageRemaining -= dmg;
- if (other.abilityCooldownDamageRemaining <= 0)
- {
- other.abilityCooldownDamageRemaining = 0;
- other.UpdateActiveAbilityIndicators();
- }
- }
- if (other.IsOwnedByOtherPlayer)
- {
- // если убийство совершает бот, владельцем которого является другой игрок (мина-паук или туррель),
- // фраг должен зачислится владельцу.
- var ownerPlayer = ActivePlayers.FirstOrDefault(pl => pl.UserId == other.bot.OwnerUserId);
- if (ownerPlayer != null)
- other = ownerPlayer;
- else
- Debug.LogErrorFormat("TakeDamage: Bot owner not found {0}", other.bot.OwnerUserId);
- }
- assistCandidates[other] = Time.realtimeSinceStartup;
- //todo закомментил vadim
- //if (!PhotonNetwork.isMasterClient)
- //{
- // // остальная логика - только на мастере.
- // return;
- //}
- //Debug.Log("take dmg " + Time.time + ", hp: " + health + ", dmg: " + the_dmg);
- //substract health by damage
- //locally for now, to only have one update later on
- if (!bullet.Owner.photonView.isMine)
- return;
- health -= dmg;
- //bullet killed the player
- if (health <= 0)
- {
- //the game is already over so don't do anything
- if (GameManager.IsGameOver())
- return;
- //movo to rpc explode
- //get killer and increase score for that team
- /*
- int otherTeam = other.GetTeamIndex();
- SpawnedEnemy en = gameObject.GetComponent<SpawnedEnemy>();
- if (en != null)
- {
- en.Dead();
- }*/
- Debug.Log("Health < 0 ");
- //tell all clients to despawn this player
- CmdExplode(other);
- /*
- // если убитый игрок является миной-пауком или туррелью, на статистику боя это никак не влияет.
- if (!IsOwnedByOtherPlayer)
- {
- IncreaseDeaths();
- int kills = other.IncreaseKills();
- float assistTimeThreshold = Time.realtimeSinceStartup - CommonBalance.Data.AssistTimeout;
- foreach (var pair in assistCandidates)
- {
- var assistedPlayer = pair.Key;
- // убившему игроку не начисляется ассист, ему начисляется kill
- if (assistedPlayer != null && assistedPlayer != other && pair.Value > assistTimeThreshold)
- {
- assistedPlayer.IncreaseAssists();
- assistedPlayer.photonView.RPC("AddAchievement", assistedPlayer.photonView.owner, Achievement.Assist);
- }
- }
- assistCandidates.Clear();
- int killsInARow;
- if (Time.realtimeSinceStartup - other.lastKillTime < CommonBalance.Data.KillInARowTimeout)
- {
- killsInARow = other.IncreaseKillsInARow();
- }
- else
- {
- killsInARow = 1;
- other.SetKillsInARow(killsInARow);
- }
- other.lastKillTime = Time.realtimeSinceStartup;
- other.photonView.RPC("AddAchievement", other.photonView.owner, GetKillAchievement(killsInARow));
- if (NetworkManager.Instance.BattleType == BattleType.Domination)
- {
- // если умерла вся команда, то обновляем счет. Это может привести к Game Over или переходу в следующий раунд
- // (см. NetworkManager.OnPhotonCustomRoomPropertiesChanged)
- int myTeamIndex = GetTeamIndex();
- if (!ActivePlayers.Any(pl => pl.IsAlive && pl.GetTeamIndex() == myTeamIndex))
- RoomManager.AddScore(otherTeam);
- }
- else if (NetworkManager.Instance.BattleType == BattleType.TeamDeathMatch || NetworkManager.Instance.BattleType == BattleType.Clash ||
- NetworkManager.Instance.BattleType == BattleType.TutorialBasic || NetworkManager.Instance.BattleType == BattleType.TutorialSecondary)
- {
- RoomManager.AddScore(otherTeam);
- }
- else if (NetworkManager.Instance.BattleType == BattleType.Bounty)
- {
- // забираем звёздочки убитого
- int resources = GetResourceCount();
- if (resources != 0)
- SetResourceCount(0);
- // если убийца жив (может быть мёртв, если это его мина или туррель), добавляем ему одну звёздочку за килл
- if (other.IsAlive && other.GetResourceCount() < CommonBalance.Data.BountyMaxPlayerResources)
- other.IncreaseResourceCount();
- // добавляем вражеской команде в счет звёздочки убитого
- RoomManager.AddScore(otherTeam, (resources + 1));
- }
- else if (NetworkManager.Instance.BattleType == BattleType.GrabResource)
- {
- // рассыпаем ресурсы, принадлежавшие погибшему игроку
- int resources = GetResourceCount();
- if (resources > 0)
- {
- SetResourceCount(0);
- GameManager.GetInstance().DestroyedTankResourceSpawner.CmdInstantiateAroundPosition(transform.position, 4f, resources);
- }
- NetworkManager.Instance.RefreshCountdownState();
- }
- } */
- }
- else
- {
- //we didn't die, set health to new value
- SetHealth(health);
- // на случай, если в одном кадре мы словили 2 пули (у нас стало < 20% хп, вторую пулю мы должны подавить щитом)
- if (PassiveAbility == AbilityType.Aegis)
- {
- CheckAegis();
- }
- if (IsBot())
- bot.OnDamageTaken(bullet);
- Damaged(this);
- }
- }
- -----
- public void CmdExplode(Player killedBy)
- {
- photonView.RPC("RpcExplode", PhotonTargets.All, killedBy.UserId);
- /* if (PhotonNetwork.isMaster
- photonView.RPC("RpcExplode", PhotonTargets.All, killedBy.UserId);
- }
- else
- {
- Debug.LogError("CmdExplode: trying to call on non-master");
- } */
- }
- //called on all clients on player death
- [PunRPC]
- protected virtual void RpcExplode(int killedByUserId)
- {
- Player killedBy = Player.ActivePlayers.FirstOrDefault(pl => pl.UserId == killedByUserId);
- if (PhotonNetwork.isMasterClient)
- {
- SpawnedEnemy en = gameObject.GetComponent<SpawnedEnemy>();
- if (en != null)
- {
- en.Dead();
- }
- int otherTeam = killedBy.GetTeamIndex();
- // если убитый игрок является миной-пауком или туррелью, на статистику боя это никак не влияет.
- if (!IsOwnedByOtherPlayer)
- {
- IncreaseDeaths();
- int kills = killedBy.IncreaseKills();
- float assistTimeThreshold = Time.realtimeSinceStartup - CommonBalance.Data.AssistTimeout;
- foreach (var pair in assistCandidates)
- {
- var assistedPlayer = pair.Key;
- // убившему игроку не начисляется ассист, ему начисляется kill
- if (assistedPlayer != null && assistedPlayer != killedBy && pair.Value > assistTimeThreshold)
- {
- assistedPlayer.IncreaseAssists();
- assistedPlayer.photonView.RPC("AddAchievement", assistedPlayer.photonView.owner, Achievement.Assist);
- }
- }
- assistCandidates.Clear();
- int killsInARow;
- if (Time.realtimeSinceStartup - killedBy.lastKillTime < CommonBalance.Data.KillInARowTimeout)
- {
- killsInARow = killedBy.IncreaseKillsInARow();
- }
- else
- {
- killsInARow = 1;
- killedBy.SetKillsInARow(killsInARow);
- }
- killedBy.lastKillTime = Time.realtimeSinceStartup;
- killedBy.photonView.RPC("AddAchievement", killedBy.photonView.owner, GetKillAchievement(killsInARow));
- if (NetworkManager.Instance.BattleType == BattleType.Domination)
- {
- // если умерла вся команда, то обновляем счет. Это может привести к Game Over или переходу в следующий раунд
- // (см. NetworkManager.OnPhotonCustomRoomPropertiesChanged)
- int myTeamIndex = GetTeamIndex();
- if (!ActivePlayers.Any(pl => pl.IsAlive && pl.GetTeamIndex() == myTeamIndex))
- RoomManager.AddScore(otherTeam);
- }
- else if (NetworkManager.Instance.BattleType == BattleType.TeamDeathMatch || NetworkManager.Instance.BattleType == BattleType.Clash ||
- NetworkManager.Instance.BattleType == BattleType.TutorialBasic || NetworkManager.Instance.BattleType == BattleType.TutorialSecondary)
- {
- RoomManager.AddScore(otherTeam);
- }
- else if (NetworkManager.Instance.BattleType == BattleType.Bounty)
- {
- // забираем звёздочки убитого
- int resources = GetResourceCount();
- if (resources != 0)
- SetResourceCount(0);
- // если убийца жив (может быть мёртв, если это его мина или туррель), добавляем ему одну звёздочку за килл
- if (killedBy.IsAlive && killedBy.GetResourceCount() < CommonBalance.Data.BountyMaxPlayerResources)
- killedBy.IncreaseResourceCount();
- // добавляем вражеской команде в счет звёздочки убитого
- RoomManager.AddScore(otherTeam, (resources + 1));
- }
- else if (NetworkManager.Instance.BattleType == BattleType.GrabResource)
- {
- // рассыпаем ресурсы, принадлежавшие погибшему игроку
- int resources = GetResourceCount();
- if (resources > 0)
- {
- SetResourceCount(0);
- GameManager.GetInstance().DestroyedTankResourceSpawner.CmdInstantiateAroundPosition(transform.position, 4f, resources);
- }
- NetworkManager.Instance.RefreshCountdownState();
- }
- }
- }
- StopAllCoroutines();
- _tankHolder.AfterExplode();
- if (killedBy == null)
- Debug.LogErrorFormat("RpcExplode: Killed by not found {0}", killedByUserId);
- IsAlive = false;
- OnActivePlayersChanged();
- Exploded(this, killedBy);
- ToggleNitro(false);
- //if (_tankHolder.TurretPart.Type == TankPartType.FlamethrowerTurret)
- //{
- // _tankHolder.TurretPart.SetDotEmitterPsState(false);
- //}
- shootCoroutine = null;
- int team_id = GetTeamIndex();
- Quaternion target_rot = Quaternion.Euler(0, myTransform.eulerAngles.y, 0);
- if (Holder.ChassisPart.Corpse != null)
- MeatDestruction.Instance.ExplodeTankParts(last_hit_dir, Holder.ChassisPart.Corpse, myTransform.position, target_rot, team_id);
- if (Holder.TurretPart.Corpse != null)
- MeatDestruction.Instance.ExplodeTankParts(last_hit_dir, Holder.TurretPart.Corpse, myTransform.position + Vector3.up * 1, target_rot, team_id);
- if (IsMe)
- {
- //reset input left over
- ResetControls();
- TankCameraController.Instance.ShakeYourBody();
- if (PassiveAbility == AbilityType.Kamikaze)
- {
- DeployKamikazeCharge();
- }
- }
- if (HasPilot)
- {
- MeatDestruction.Instance.ThrowPilot(myTransform.forward, new Vector3(myTransform.position.x, 0.1f, myTransform.position.z),
- Quaternion.Euler(0, Random.Range(0f, 359f), 0), team_id);
- }
- Vector3 blood_pos = new Vector3(myTransform.position.x, 0.0f, myTransform.position.z);
- GameManager.GetInstance().AddTimeSlice(MeatDestruction.Instance.blood_decals[0], blood_pos, target_rot);//, 1f, null, null, true);
- // проверяем IsVisible до ToggleTank, т.к. оно сразу станет false
- if (IsVisible)
- {
- if (_tankHolder.TurretPart.ExplosionFX != null)
- {
- GameManager.GetInstance().AddTimeSlice(_tankHolder.TurretPart.ExplosionFX, myTransform.position, myTransform.rotation);
- }
- }
- ToggleTank(false);
- //play sound clip on player death
- AudioManager.Play3D(SoundType.TankDestroyed, myTransform.position);
- UpdateTrackTrailState();
- if (IsBot())
- bot.OnExplode();
- float respawnTime = CommonBalance.GetBattleRespawnTime(NetworkManager.Instance.BattleType);
- if (respawnTime > 0f && !IsOwnedByOtherPlayer)
- {
- // NOTE: запускаем корутину на GameManager, т.к. текущий Player выключен.
- // Корутина запускается в том числе на не-мастерах, т.к. пока закончится её таймер, мастер может смениться.
- StartRespawnOnTimer(respawnTime);
- }
- if (!IsMe)
- return;
- // перемещаем танк на позицию его будущего спавна, после того, как камера показала его смерть
- // иначе во время респавна, танк появится на месте смерти для постороннего наблюдателя.
- //GameManager.GetInstance().InvokeWithDelay(TankCameraController.Instance.DeathCameraRetargetPause + 0.1f, ResetPositionAfterExplode);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement