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);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
 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);
         }
     }
 }
Beispiel #4
0
        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);
                }
            }
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 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);
             }
         }
     }
 }
Beispiel #7
0
 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;
             }
         }
     }
 }
Beispiel #8
0
 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();
         }
     }
 }
Beispiel #12
0
 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();
             }
         }
     }
 }
Beispiel #13
0
 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;
             }
         }
     }
 }
Beispiel #14
0
        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);
            }
        }
Beispiel #15
0
        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);
                    }
                }
            }
        }
Beispiel #17
0
        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);
            }
        }
Beispiel #18
0
        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!");
                }
            }
        }