コード例 #1
0
        IEnumerator DealDamage()
        {
            float dmg = 5 + ModdedPlayer.Stats.spellFlatDmg / 3f;

            dmg *= ModdedPlayer.Stats.SpellDamageMult;
            float crit = ModdedPlayer.Stats.RandomCritDamage;

            dmg *= crit;
            dmg *= radius / 3.33333f;
            dmg *= ModdedPlayer.Stats.spell_snowstormDamageMult;
            var hits             = Physics.SphereCastAll(LocalPlayer.Transform.position, radius, Vector3.one, radius, -9);
            int onHitEffectProcs = 0;

            if (GameSetup.IsMpClient)
            {
                for (int i = 0; i < hits.Length; i++)
                {
                    if (hits[i].transform.CompareTag("enemyCollide"))
                    {
                        var entity = hits[i].transform.GetComponentInParent <BoltEntity>();
                        if (entity != null)
                        {
                            var phe = PlayerHitEnemy.Create(GlobalTargets.OnlyServer);
                            phe.Target          = entity;
                            phe.getAttackerType = DamageMath.SILENTattackerTypeMagic;
                            phe.Hit             = DamageMath.GetSendableDamage(dmg);
                            phe.Send();
                            if (onHitEffectProcs < 6)
                            {
                                {
                                    var hitContext = new COTFEvents.HitOtherParams(dmg, crit != 1, entity, this);
                                    COTFEvents.Instance.OnHitSpell.Invoke(hitContext);
                                    COTFEvents.Instance.OnHitEnemy.Invoke(hitContext);
                                }
                                ModdedPlayer.instance.OnHit();
                                onHitEffectProcs++;
                            }
                            yield return(null);

                            EnemyProgression.ReduceArmor(entity, Mathf.CeilToInt(dmg / 100f));
                            EnemyProgression.Slow(entity, 144, 0.2f, 0.95f);
                            yield return(null);

                            if (ModdedPlayer.Stats.spell_snowstormPullEnemiesIn)
                            {
                                if ((hits[i].point - LocalPlayer.Transform.position).sqrMagnitude > 4)
                                {
                                    EnemyProgression.AddKnockbackByDistance(entity.networkId.PackedValue, (LocalPlayer.Transform.position - hits[i].transform.position).normalized, 1);
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < hits.Length; i++)
                {
                    if (EnemyManager.enemyByTransform.ContainsKey(hits[i].transform.root))
                    {
                        EnemyProgression prog = EnemyManager.enemyByTransform[hits[i].transform.root];

                        if (prog == null)
                        {
                            continue;
                        }

                        prog.HitMagic(dmg);
                        prog.Slow(144, 0.2f, 0.85f);
                        prog.ReduceArmor(Mathf.CeilToInt(dmg / 100f));
                        if (onHitEffectProcs < 6)
                        {
                            ModdedPlayer.instance.OnHit();
                            onHitEffectProcs++;
                        }
                        {
                            var hitContext = new COTFEvents.HitOtherParams(dmg, crit != 1, prog, this);
                            COTFEvents.Instance.OnHitSpell.Invoke(hitContext);
                            COTFEvents.Instance.OnHitEnemy.Invoke(hitContext);
                        }
                        if (ModdedPlayer.Stats.spell_snowstormPullEnemiesIn)
                        {
                            if ((hits[i].point - LocalPlayer.Transform.position).sqrMagnitude > 4)
                            {
                                prog.AddKnockbackByDistance((LocalPlayer.Transform.position - hits[i].transform.position).normalized, 1);
                            }
                        }
                        yield return(null);
                    }
                }
            }
        }