private List <AttackResult> ExecuteRangedStrikes(List <Attack> p_attacks, Monster p_target, Character p_sorcerer) { List <AttackResult> list = new List <AttackResult>(); AttacksEventArgs attacksEventArgs = new AttacksEventArgs(false); foreach (Attack attack in p_attacks) { p_sorcerer.SelectedMonster = p_target; if (p_target != null && p_target.CurrentHealth > 0) { p_sorcerer.EnchantmentHandler.AddExtraDamageFromSuffix(attack, attack.AttackHand, p_target); Equipment equipment = p_sorcerer.Equipment.GetItemAt(attack.AttackHand) as Equipment; p_sorcerer.EnchantmentHandler.AfflictDamageOfTargetsHP(p_target, equipment.Suffixes, attack); AttackResult attackResult = p_target.CombatHandler.AttackMonster(p_sorcerer, attack, false, true, EDamageType.PHYSICAL, false, 0); list.Add(attackResult); p_sorcerer.FightHandler.FeedDelayedActionLog(attackResult); attacksEventArgs.Attacks.Add(new AttacksEventArgs.AttackedTarget(p_target, attackResult)); p_sorcerer.EnchantmentHandler.ResolveCombatEffects(attackResult, attack.AttackHand, p_target, false); p_sorcerer.SkillHandler.ResolveCombatEffects(attackResult, attack.AttackHand, p_target); } } LegacyLogic.Instance.EventManager.InvokeEvent(p_sorcerer, EEventType.CHARACTER_ATTACKS_RANGED, attacksEventArgs); p_sorcerer.SkillHandler.ResolveStrikeCombatEffects(true, p_target); return(list); }
private void OnMonsterAttacksGeneric(Object p_sender, EventArgs p_args, Boolean p_isRanged) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { ShowHitEffect((Monster)p_sender); } }
protected virtual void OnMonsterAttacksRanged(Object p_sender, EventArgs p_args) { if (p_sender == MyController) { AttacksEventArgs attacksEventArgs = p_args as AttacksEventArgs; if (attacksEventArgs != null && !attacksEventArgs.Counterattack) { OnMonsterAttacksGeneric(p_sender, attacksEventArgs, true); } } }
private void OnMonsterAttacksGeneric(Object p_sender, EventArgs p_args, Boolean p_isRanged) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (attackedTarget.AttackTarget == m_character) { ShowDamageTextAndAnimationAndPlaySound(attackedTarget.AttackResult, p_isRanged, false, false); } } }
public override void DoEffect(Monster p_monster, Character p_target, SpellEventArgs p_spellArgs) { Attack singleMeleeAttack = p_monster.CombatHandler.GetSingleMeleeAttack(); AttackResult attackResult = p_target.FightHandler.AttackEntity(singleMeleeAttack, true, MagicSchool, true, 0, false); p_target.ApplyDamages(attackResult, p_monster); p_target.FightHandler.CurrentMeleeBlockAttempts = 0; p_target.FightHandler.CurrentGeneralBlockAttempts = 0; AttacksEventArgs attacksEventArgs = new AttacksEventArgs(false); attacksEventArgs.Attacks.Add(new AttacksEventArgs.AttackedTarget(p_target, attackResult)); LegacyLogic.Instance.EventManager.InvokeEvent(p_monster, EEventType.MONSTER_ATTACKS, attacksEventArgs); }
private void OnReceiveReflectedDamage(Object p_sender, EventArgs p_args) { Debug.LogError("MonsterCombatView: obseletate, should not be used! This function has a bug! Use LevelEntityCombatView instead!"); if (p_args is AttacksEventArgs) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget item in attacksEventArgs.Attacks) { if (item.AttackTarget == MyController) { m_reflectedMagicDamage.Add(item); } } } }
private void OnCharacterAttacksDelayed(Object p_sender, EventArgs p_args) { if (MyController != null && m_HPBar != null) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (MyController == attackedTarget.AttackTarget) { UpdateHealthBar((Monster)MyController); UpdateBuffs(); break; } } } }
private void OnCharacterAttacks(Object p_sender, EventArgs p_args) { if (MyController != null && m_HPBar != null) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (MyController == attackedTarget.AttackTarget) { m_lastHitTime = Time.time; m_lastHitFrame = Time.frameCount; break; } } } }
private void OnCharacterAttackOrCastSpell(Object p_sender, EventArgs p_args) { Monster monster = MyController as Monster; Int32 num = monster.CurrentHealth; Boolean flag = false; Boolean flag2 = false; if (p_sender is Summon) { OnEntityTakeHitCastSpell_OnFxHit(p_sender, p_args); return; } if (p_args is AttacksEventArgs) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (attackedTarget.AttackTarget == MyController) { EResultType result = attackedTarget.AttackResult.Result; if (result == EResultType.EVADE) { flag2 = true; } else if (result == EResultType.BLOCK) { flag = true; } if (result != EResultType.BLOCK && result != EResultType.EVADE) { num -= attackedTarget.AttackResult.DamageDone; } } } if (flag && num > 0) { m_animatorControl.Block(); return; } if (flag2 && num > 0) { m_animatorControl.Evade(); return; } } }
private void AttackEvent(Object p_sender, EventArgs p_args) { m_GetPriority = false; m_GotID = false; AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (attackedTarget.BarkEventArgs != null) { for (Int32 i = 0; i < attackedTarget.BarkEventArgs.Length; i++) { BarkEventArgs barkEventArgs = attackedTarget.BarkEventArgs[i]; if (barkEventArgs != null) { if (barkEventArgs.priority == 100 || (barkEventArgs.priority == 0 && !m_GotID)) { String text; String text2; GenerateAudioID(barkEventArgs.character, barkEventArgs.barkclip, out text, out text2); if (!AudioController.IsPlaying(text2)) { m_GotID = true; PlayBark(barkEventArgs.character.Index, text2); } } else if (!m_GetPriority && !m_GotID) { m_Barklist.Add(barkEventArgs); m_GetPriority = true; } } if (i == attackedTarget.BarkEventArgs.Length - 1) { m_GetPriority = true; } } } } }
private void OnReceiveReflectedDamage(Object p_sender, EventArgs p_args) { if (p_args is AttacksEventArgs) { Boolean flag = false; AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget item in attacksEventArgs.Attacks) { if (item.AttackTarget == MyController) { m_reflectedMagicDamage.Add(item); flag = true; } } UpdateManager updateManager = LegacyLogic.Instance.UpdateManager; if (updateManager.CurrentTurnActor == updateManager.PartyTurnActor && flag && MyController is Monster) { CheckForReflectedDamage(); m_reflectedMagicDamage.Clear(); } } }
private void OnCharacterFXDone(Object p_sender, EventArgs p_args) { if (MyController != null) { Boolean flag = false; AttacksEventArgs attacksEventArgs = p_args as AttacksEventArgs; if (attacksEventArgs != null) { flag = attacksEventArgs.Counterattack; } if (!flag) { ((Party)MyController).AttackingDone.Trigger(); ((Party)MyController).MonsterHitAnimationDone.Trigger(); if (p_sender is Character) { ((Character)p_sender).FlushActionLog(); ((Character)p_sender).FinishCastSpellEvent(); } } } }
private void OnCharacterAttackOrSpell(Object p_sender, EventArgs p_args) { if (p_args is AttacksEventArgs) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (attackedTarget.AttackTarget == MyController) { m_LastAttackOrSpellFrameCount = Time.frameCount; EResultType result = attackedTarget.AttackResult.Result; if (result == EResultType.BLOCK || result == EResultType.EVADE) { PlayAnimation(EAnimType.DEFEND, EState.HIT, -1f, 1f); break; } } } } else if (p_args is SpellEventArgs) { if (p_sender is Summon) { OnTakeHitSpell_OnFxHit(p_sender, p_args); return; } SpellEventArgs spellEventArgs = (SpellEventArgs)p_args; foreach (AttackedTarget attackedTarget2 in spellEventArgs.SpellTargetsOfType <AttackedTarget>()) { if (attackedTarget2.Target == MyController) { m_LastAttackOrSpellFrameCount = Time.frameCount; break; } } } }
private void OnCharacterAttacks(Object p_sender, EventArgs p_args) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; if (attacksEventArgs.Attacks.Count == 0) { OnCharacterFXDone(p_sender, p_args); return; } Character character = (Character)p_sender; character.FightHandler.FlushActionLog(); character.EnchantmentHandler.FlushActionLog(); DelayedEventManager.InvokeEvent(EDelayType.ON_FX_HIT, EEventType.CHARACTER_ATTACKS, p_sender, p_args); GameObject currentCamera = FXMainCamera.Instance.CurrentCamera; if (currentCamera != null) { Int32 num = Random.Range(1, 4); GameObject gameObject = Helper.Instantiate <GameObject>(Helper.ResourcesLoad <GameObject>("FX/Hit/HitFx" + num)); Vector3 a = Vector3.zero; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (attackedTarget.AttackTarget != null && attackedTarget.AttackTarget is Monster) { Monster p_controller = (Monster)attackedTarget.AttackTarget; GameObject gameObject2 = ViewManager.Instance.FindView(p_controller).gameObject; MonsterHPBarView component = gameObject2.GetComponent <MonsterHPBarView>(); a = gameObject2.transform.position + new Vector3(0f, component.HPBarAnchor.position.y / 1.8f, 0f); } } gameObject.transform.position = a - currentCamera.transform.forward * 1.9f; gameObject.transform.rotation = currentCamera.transform.rotation; Destroy(gameObject.gameObject, 0.5f); } }
private void OnTakeHitAttackGeneric(Object p_sender, EventArgs p_args, EEventType p_eventType) { Boolean flag = true; Boolean flag2 = false; if (p_args is AttacksEventArgs) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (attackedTarget.AttackTarget == MyController) { AttackResult attackResult = attackedTarget.AttackResult; if (!flag2 && attacksEventArgs.PushToParty) { flag2 = true; m_MainView.PushEntityToPosition(); } foreach (AttacksEventArgs.AttackedTarget attackedTarget2 in attacksEventArgs.Attacks) { if (attackedTarget2.AttackTarget != null && attackedTarget2.AttackTarget == MyController) { Monster monster = (Monster)MyController; FlushMonsterLogEntries(); monster.CombatHandler.CheckCounterAttack((Character)p_sender); List <CombatEntryEventArgs> counterLogEntries = monster.CombatHandler.CounterLogEntries; if (counterLogEntries.Count > 0) { foreach (CombatEntryEventArgs p_args2 in counterLogEntries) { LegacyLogic.Instance.ActionLog.PushEntry(p_args2); if (LegacyLogic.Instance.WorldManager.Party.Buffs.HasBuff(EPartyBuffs.CELESTIAL_ARMOR)) { if (LegacyLogic.Instance.WorldManager.Party.Buffs.GetBuff(EPartyBuffs.CELESTIAL_ARMOR).IsExpired()) { LegacyLogic.Instance.WorldManager.Party.Buffs.RemoveBuff(EPartyBuffs.CELESTIAL_ARMOR); } LegacyLogic.Instance.WorldManager.Party.Buffs.FlushActionLog(); } ((Character)p_sender).ConditionHandler.FlushActionLog(); ((Character)p_sender).ConditionHandler.FlushDelayedActionLog(); } } counterLogEntries.Clear(); if (monster.AiHandler is MamushiAIHandler) { ((Character)p_sender).FightHandler.FlushActionLog(); ((Character)p_sender).FightHandler.FlushDelayedActionLog(); ((Character)p_sender).FlushNormalActionLog(); } } } if (attackResult.ReflectedDamage != null && attackResult.ReflectedDamage.Damages.Count > 0 && MyController is Monster) { Monster p_attacker = MyController as Monster; AttackResult attackResult2 = ((Character)p_sender).FightHandler.AttackEntity(attackResult.ReflectedDamage, true, EDamageType.PHYSICAL, true, 0, false); ((Character)p_sender).ApplyDamages(attackResult2, p_attacker); Object p_source = (attackResult2.ReflectedDamageSource != null) ? attackResult2.ReflectedDamageSource : MyController; CombatEntryEventArgs p_args3 = new CombatEntryEventArgs(p_source, p_sender, attackResult2, null); LegacyLogic.Instance.ActionLog.PushEntry(p_args3); AttacksEventArgs attacksEventArgs2 = new AttacksEventArgs(false); attacksEventArgs2.Attacks.Add(new AttacksEventArgs.AttackedTarget(p_sender, attackResult2)); DelayedEventManager.InvokeEvent(EDelayType.ON_FX_FINISH, EEventType.REFLECTED_MAGIC_DAMAGE, p_sender, attacksEventArgs2); } if (flag) { flag = false; m_CommandQueue.Enqueue(delegate { ((Monster)MyController).HitAnimationDone.Trigger(); DelayedEventManager.InvokeEvent(EDelayType.ON_FX_FINISH, p_eventType, p_sender, p_args); }); PlayTakeHitSound(p_sender, attackResult, p_eventType == EEventType.CHARACTER_ATTACKS_RANGED); } TakeHit(attackedTarget.AttackResult, false); } } } else if (p_args is SpellEventArgs) { SpellEventArgs spellEventArgs = (SpellEventArgs)p_args; foreach (AttackedTarget attackedTarget3 in spellEventArgs.SpellTargetsOfType <AttackedTarget>()) { if (attackedTarget3.Target == MyController) { if (p_sender is Summon) { ((Summon)p_sender).FlushActionLog(); } FlushMonsterLogEntries(); if (flag) { flag = false; m_CommandQueue.Enqueue(delegate { ((Monster)MyController).HitAnimationDone.Trigger(); if (!(p_sender is Summon)) { DelayedEventManager.InvokeEvent(EDelayType.ON_FX_FINISH, EEventType.CHARACTER_CAST_SPELL, p_sender, p_args); } }); } TakeHit(attackedTarget3.Result, spellEventArgs.DamageType != EDamageType.PHYSICAL); } } foreach (PushedTarget pushedTarget in spellEventArgs.SpellTargetsOfType <PushedTarget>()) { if (pushedTarget.Target == MyController) { m_MainView.PushEntityToPosition(); } } } }
private void TakeHit(Object p_sender, EventArgs p_args, Boolean p_isRanged) { Int32 tagHash = m_animator.GetCurrentAnimatorStateInfo(0).tagHash; Int32 tagHash2 = m_animator.GetNextAnimatorStateInfo(0).tagHash; Int32 num = Animator.StringToHash("ATTACK"); Int32 num2 = Animator.StringToHash("DIE"); Boolean flag = true; Boolean flag2 = false; if (p_args is AttacksEventArgs) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { if (attackedTarget.AttackTarget == MyController) { AttackResult attackResult = attackedTarget.AttackResult; if (flag) { flag = false; ((Monster)MyController).HitAnimationDone.Trigger(); FlushMonsterLogEntries(); DelayedEventManager.InvokeEvent(EDelayType.ON_FX_FINISH, (!p_isRanged) ? EEventType.CHARACTER_ATTACKS : EEventType.CHARACTER_ATTACKS_RANGED, p_sender, p_args); if (attackedTarget.AttackResult.DamageDone > 0 && num2 != tagHash && num2 != tagHash2 && num != tagHash && num != tagHash2) { m_animatorControl.Hit(); } PlayTakeHitSound(p_sender, attackResult, p_isRanged); } if (!flag2 && attacksEventArgs.PushToParty) { flag2 = true; m_MainView.PushEntityToPosition(); } foreach (AttacksEventArgs.AttackedTarget attackedTarget2 in attacksEventArgs.Attacks) { if (attackedTarget2.AttackTarget != null && attackedTarget2.AttackTarget == MyController) { Monster monster = (Monster)MyController; monster.CombatHandler.CheckCounterAttack((Character)p_sender); List <CombatEntryEventArgs> counterLogEntries = monster.CombatHandler.CounterLogEntries; if (counterLogEntries.Count > 0) { foreach (CombatEntryEventArgs p_args2 in counterLogEntries) { LegacyLogic.Instance.ActionLog.PushEntry(p_args2); if (LegacyLogic.Instance.WorldManager.Party.Buffs.HasBuff(EPartyBuffs.CELESTIAL_ARMOR)) { if (LegacyLogic.Instance.WorldManager.Party.Buffs.GetBuff(EPartyBuffs.CELESTIAL_ARMOR).IsExpired()) { LegacyLogic.Instance.WorldManager.Party.Buffs.RemoveBuff(EPartyBuffs.CELESTIAL_ARMOR); } LegacyLogic.Instance.WorldManager.Party.Buffs.FlushActionLog(); } ((Character)p_sender).ConditionHandler.FlushActionLog(); ((Character)p_sender).ConditionHandler.FlushDelayedActionLog(); } } counterLogEntries.Clear(); } } if (attackResult.ReflectedDamage != null && attackResult.ReflectedDamage.Damages.Count > 0 && MyController is Monster && (!p_isRanged || (p_isRanged && ((Monster)MyController).DistanceToParty < 1.1f))) { ((Monster)MyController).AbilityHandler.FlushActionLog(EExecutionPhase.ON_CHARACTER_ATTACKS_MONSTER_AFTER_DAMAGE_REDUCTION); AttackResult attackResult2 = ((Character)p_sender).FightHandler.AttackEntity(attackResult.ReflectedDamage, true, EDamageType.PHYSICAL, true, 0, false); ((Character)p_sender).ApplyDamages(attackResult2, (Monster)MyController); Object p_source = (attackResult2.ReflectedDamageSource != null) ? attackResult2.ReflectedDamageSource : MyController; CombatEntryEventArgs p_args3 = new CombatEntryEventArgs(p_source, p_sender, attackResult2, null); LegacyLogic.Instance.ActionLog.PushEntry(p_args3); DelayedEventManager.InvokeEvent(EDelayType.ON_FX_FINISH, EEventType.REFLECTED_MAGIC_DAMAGE, p_sender, new AttacksEventArgs(false) { Attacks = { new AttacksEventArgs.AttackedTarget(p_sender, attackResult2) } }); } this.SendEvent("OnReceivedAttacks", new AttacksUnityEventArgs(this, attackResult, false)); } } } else if (p_args is SpellEventArgs) { SpellEventArgs spellEventArgs = (SpellEventArgs)p_args; foreach (AttackedTarget attackedTarget3 in spellEventArgs.SpellTargetsOfType <AttackedTarget>()) { if (attackedTarget3.Target == MyController) { if (flag) { flag = false; TakeHitDoFinishBySpell(p_sender, p_args); if (attackedTarget3.Result.DamageDone > 0 && num2 != tagHash && num2 != tagHash2 && num != tagHash && num != tagHash2) { m_animatorControl.Hit(); } } if (attackedTarget3.Result.ReflectedDamage != null && attackedTarget3.Result.ReflectedDamage.Damages.Count > 0 && MyController is Monster && (!p_isRanged || (p_isRanged && ((Monster)MyController).DistanceToParty < 1.1f))) { ((Monster)MyController).AbilityHandler.FlushActionLog(EExecutionPhase.ON_CHARACTER_ATTACKS_MONSTER_AFTER_DAMAGE_REDUCTION); AttackResult attackResult3 = ((Character)p_sender).FightHandler.AttackEntity(attackedTarget3.Result.ReflectedDamage, true, EDamageType.PHYSICAL, true, 0, false); ((Character)p_sender).ApplyDamages(attackResult3, (Monster)MyController); Object p_source2 = (attackResult3.ReflectedDamageSource != null) ? attackResult3.ReflectedDamageSource : MyController; CombatEntryEventArgs p_args4 = new CombatEntryEventArgs(p_source2, p_sender, attackResult3, null); LegacyLogic.Instance.ActionLog.PushEntry(p_args4); DelayedEventManager.InvokeEvent(EDelayType.ON_FX_FINISH, EEventType.REFLECTED_MAGIC_DAMAGE, p_sender, new AttacksEventArgs(false) { Attacks = { new AttacksEventArgs.AttackedTarget(p_sender, attackResult3) } }); } this.SendEvent("OnReceivedAttacks", new AttacksUnityEventArgs(this, attackedTarget3.Result, spellEventArgs.DamageType != EDamageType.PHYSICAL)); } } foreach (PushedTarget pushedTarget in spellEventArgs.SpellTargetsOfType <PushedTarget>()) { if (pushedTarget.Target == MyController) { m_MainView.PushEntityToPosition(); } } foreach (MonsterBuffTarget monsterBuffTarget in spellEventArgs.SpellTargetsOfType <MonsterBuffTarget>()) { if (flag && monsterBuffTarget.Target == MyController) { flag = false; TakeHitDoFinishBySpell(p_sender, p_args); } } } }
protected virtual void OnMonsterAttacksGeneric(Object p_sender, AttacksEventArgs p_args, Boolean p_isRanged) { PlayerEntityView playerEntity = FXHelper.GetPlayerEntity(); Vector3 p_slotOriginPosition; Vector3 p_slotForward; Vector3 p_slotLeft; Vector3 p_slotTargetPosition; ViewManager.GetSlotDatas(MyController.Position, LegacyLogic.Instance.WorldManager.Party.Position, out p_slotOriginPosition, out p_slotForward, out p_slotLeft, out p_slotTargetPosition); Boolean flag = false; GameObject gameObject = null; List <Action> callbacks = new List <Action>(p_args.Attacks.Count); EResultType eresultType = EResultType.HIT; Int32 num = 0; List <Character> targets = new List <Character>(); AttacksEventArgs.AttackedTarget attack; foreach (AttacksEventArgs.AttackedTarget attack2 in p_args.Attacks) { attack = attack2; num++; if (attack.AttackTarget is Character) { Character chara = (Character)attack.AttackTarget; AttackResult result = attack.AttackResult; targets.Add(chara); if (playerEntity != null) { gameObject = playerEntity.GetMemberGameObject(chara.Index); } if (gameObject == null) { Debug.LogError("Could not find target character! Char-Index: " + chara.Index); } else { flag |= attack.IsCriticalAttack; callbacks.Add(delegate { if (p_sender is Monster && ((Monster)p_sender).AbilityHandler.HasEntriesForPhase(EExecutionPhase.BEFORE_MONSTER_ATTACK)) { ((Monster)p_sender).AbilityHandler.FlushActionLog(EExecutionPhase.BEFORE_MONSTER_ATTACK); chara.ConditionHandler.FlushActionLog(); } if (((Monster)p_sender).AbilityHandler.HasEntriesForPhase(EExecutionPhase.AFTER_DAMAGE_CALCULATION)) { ((Monster)p_sender).AbilityHandler.FlushActionLog(EExecutionPhase.AFTER_DAMAGE_CALCULATION); } CombatEntryEventArgs p_args2 = new CombatEntryEventArgs(p_sender, chara, result, attack.BloodMagicEventArgs); LegacyLogic.Instance.ActionLog.PushEntry(p_args2); if (LegacyLogic.Instance.WorldManager.Party.Buffs.HasBuff(EPartyBuffs.SHADOW_CLOAK) && result.Result == EResultType.EVADE) { LegacyLogic.Instance.WorldManager.Party.Buffs.RemoveBuff(EPartyBuffs.SHADOW_CLOAK); } if (LegacyLogic.Instance.WorldManager.Party.Buffs.HasBuff(EPartyBuffs.CELESTIAL_ARMOR)) { if (LegacyLogic.Instance.WorldManager.Party.Buffs.GetBuff(EPartyBuffs.CELESTIAL_ARMOR).IsExpired()) { LegacyLogic.Instance.WorldManager.Party.Buffs.RemoveBuff(EPartyBuffs.CELESTIAL_ARMOR); } LegacyLogic.Instance.WorldManager.Party.Buffs.FlushActionLog(); } chara.FightHandler.FlushCounterAttackActionLog(); LegacyLogic.Instance.WorldManager.Party.Buffs.FlushActionLog(); if (p_sender is Monster && ((Monster)p_sender).AbilityHandler.HasEntriesForPhase(EExecutionPhase.AFTER_MONSTER_ATTACK)) { ((Monster)p_sender).AbilityHandler.FlushActionLog(EExecutionPhase.AFTER_MONSTER_ATTACK); chara.ConditionHandler.FlushActionLog(); } }); if (attack.AttackResult.Result == EResultType.BLOCK) { eresultType = EResultType.BLOCK; } else if (eresultType != EResultType.BLOCK && attack.AttackResult.Result == EResultType.EVADE) { eresultType = EResultType.EVADE; } } } } Action action = delegate { DelayedEventManager.InvokeEvent(EDelayType.ON_FX_HIT, (!p_isRanged) ? EEventType.MONSTER_ATTACKS : EEventType.MONSTER_ATTACKS_RANGED, p_sender, p_args); if (!p_isRanged) { foreach (AttacksEventArgs.AttackedTarget attackedTarget in p_args.Attacks) { ((Monster)MyController).CombatHandler.TriggerCounterAttacks(attackedTarget.AttackTarget, attackedTarget.AttackResult); } } foreach (Action action2 in callbacks) { action2(); } foreach (Character character in targets) { character.ConditionHandler.FlushDelayedActionLog(); } }; if (gameObject == null) { gameObject = playerEntity.GetMemberGameObject(UnityEngine.Random.Range(0, 4)); if (gameObject == null) { Debug.LogError("No target character could be found! Will skip whole FX! Num of Attacks = " + p_args.Attacks.Count); action(); return; } } FXArgs p_fxArgs = new FXArgs(this.gameObject, gameObject, this.gameObject, gameObject, p_slotOriginPosition, p_slotForward, p_slotLeft, p_slotTargetPosition); if (p_isRanged) { AttackRanged(p_fxArgs, action, (!flag) ? eresultType : EResultType.CRITICAL_HIT); } else if (flag) { AttackCritical(p_fxArgs, action); } else { Attack(p_fxArgs, action); } }
private void OnCharacterAttacksRanged(Object p_sender, EventArgs p_args) { AttacksEventArgs attacksEventArgs = (AttacksEventArgs)p_args; if (attacksEventArgs.Attacks.Count == 0) { OnCharacterFXDone(p_sender, p_args); return; } Character character = (Character)p_sender; Boolean flag = true; foreach (AttacksEventArgs.AttackedTarget attackedTarget in attacksEventArgs.Attacks) { Monster monster = (Monster)attackedTarget.AttackTarget; EResultType result = attackedTarget.AttackResult.Result; FXQueue rangedFX = GetRangedFX(attacksEventArgs.IsTryingToPushToParty, character, result); if (rangedFX != null) { Vector3 p_slotOriginPosition; Vector3 p_slotForward; Vector3 p_slotLeft; Vector3 p_slotTargetPosition; ViewManager.GetSlotDatas(((Party)MyController).Position, monster.Position, out p_slotOriginPosition, out p_slotForward, out p_slotLeft, out p_slotTargetPosition); GameObject memberGameObject = m_PartyView.GetMemberGameObject(character.Index); GameObject gameObject = null; GameObject gameObject2 = null; if (result == EResultType.EVADE) { gameObject = ViewManager.Instance.FindView(monster); gameObject2 = new GameObject("Miss hit point on the ground"); Destroy(gameObject2, 30f); gameObject2.transform.position = gameObject.transform.position + (transform.position - gameObject.transform.position).normalized + transform.right * 2f * (UnityEngine.Random.value - 0.5f); } else { FXTags fxtags = ViewManager.Instance.FindViewAndGetComponent <FXTags>(monster); if (fxtags != null) { gameObject = fxtags.gameObject; gameObject2 = fxtags.FindOne((result != EResultType.BLOCK) ? "HitSpot" : "BlockHitSpot"); } } if (memberGameObject == null || gameObject == null || gameObject2 == null) { if (flag) { OnRangedFXHit(p_sender, p_args); } OnCharacterFXDone(p_sender, p_args); Debug.LogError(String.Concat(new Object[] { "Attacker/Target not found!\nAttacker=", memberGameObject, "\ntargetGO=", gameObject, "\nfxEndpointGO=", gameObject2 })); break; } FXArgs args = new FXArgs(memberGameObject, gameObject, memberGameObject, gameObject2, p_slotOriginPosition, p_slotForward, p_slotLeft, p_slotTargetPosition); FXQueue fxqueue = Helper.Instantiate <FXQueue>(rangedFX); fxqueue.Execute(args); if (flag) { flag = false; fxqueue.Finished += delegate(Object o, EventArgs e) { OnRangedFXHit(p_sender, p_args); }; } } else { if (flag) { flag = false; OnRangedFXHit(p_sender, p_args); } OnCharacterFXDone(p_sender, p_args); Debug.LogError("Ranged FX(" + result + ") missing!"); } } }