private void OnAttacked(AttackFlow flow) { bool isAlreadyDead = flow.Target.Hp.Cur.Value == flow.Target.Hp.Min.Value; if (isAlreadyDead) { return; } int damage = flow.Target.DamageReactor.ReactTo(flow.Attacker, flow.Damage, flow.IsCritical); if (flow.Target is IPhotonBehaviour photonTarget) { HitEffectPopupEnvironment.Instance.PopupHitEffect(flow.HitEffectType, photonTarget); PopupNumber(flow.Attacker, photonTarget, damage, flow.IsCritical); // NOTE: Only died player client sends kill/death sync. SyncKillAndDeath(flow.Attacker, flow.Target); } if (flow.Target is Enemy enemy) { enemy.TargetChaseSystem.SetChaseTarget(flow.Attacker.transform); } }
private void SyncAttackRPC(int attackerViewID, int targetViewID, int damage, bool isCritical, HitEffectType hitEffectType) { var attacker = PhotonView.Find(attackerViewID).gameObject.GetComponent <IAttacker>(); var target = PhotonView.Find(targetViewID).gameObject.GetComponent <IOnAttacked>(); Assert.IsNotNull(attacker); Assert.IsNotNull(target); var flow = new AttackFlow(attacker, target, damage, isCritical, hitEffectType); SkillStream.OnNextAttack(flow); }
public static void OnNextAttack(AttackFlow AttackFlow) { _attackSubject.OnNext(AttackFlow); }