protected override void OnUpdate(float dt)
        {
            if (IsFinish())
            {
                return;
            }

            elapsed             += dt;
            timeUntilNextDamage -= dt;
            if (timeUntilNextDamage < 0)
            {
                timeUntilNextDamage = this.info.DotModifierConfig.interval;
                SourceHistory sourceHistory = new SourceHistory(Source.FromSkill(parentSkill, skillId))
                                              .Add(Source.FromModifier(this));
                DamageFromAttack damage = new DamageFromAttack(
                    sourceHistory,
                    this.info.DotModifierConfig.damageScale, false, 1f, 1,
                    casterEntity.Id, targetMovementComponent.Position,
                    targetMovementComponent.Position,
                    characterStats,
                    false, info.DotModifierConfig.ShowDeathBehavior(),
                    false
                    );
                damage.CauseTargetToDie(false);
                targetHealthComponent.ReceiveDamage(damage);
            }

            if (targetHealthComponent.Health <= 1)
            {
                _1HpLifetime.End();
            }
        }
Exemple #2
0
        private void OnWallCollision(object sender, WallCollisionEventArgs e)
        {
            if (!info.RagdollModifierConfig.enableWallHit)
            {
                return;
            }

            if (elapsed < timeUntilGround && !isWallHit)
            {
                isWallHit = true;
                lifetime.End();
                bool             found;
                Stats            casterAtkStats = casterEntity.GetComponent <StatsComponent>().CharacterStats.FindStats(StatsType.RawAtk, out found);
                DamageFromAttack dfa            = new DamageFromAttack(
                    new SourceHistory(Source.FromSkill(info.ShowParentSkill(), skillId)),
                    whc.damageScale * damageScale, false, 1, 1, casterEntity.Id, targetCharacter.Position(),
                    targetCharacter.Position(),
                    characterStats
                    );
                for (int kIndex = 0; kIndex < whc.modifiers.Count; kIndex++)
                {
                    dfa.AddModifierInfo(
                        CastProjectileAction.OnHitPhase.Damaged,
                        ((DefaultSkillCharacter)targetCharacter).CreateModifierInfo(
                            info.ShowParentSkill(), whc.modifiers[kIndex]
                            )
                        );
                }
                targetEntity.GetComponent <HealthComponent>().ReceiveDamage(dfa);
            }
        }
        protected override void OnUpdate(float dt)
        {
            if (target == null)
            {
                return;
            }

            Vector2 delta = (Vector2)target.Position() - lastPos;

            accumulatedDistance += Mathf.Abs(delta.x);
            if (accumulatedDistance >= info.Bmc.maxDistance)
            {
                accumulatedTriggerDistance += Mathf.Abs(delta.x);
                if (accumulatedTriggerDistance >= info.Bmc.triggerDistance)
                {
                    accumulatedTriggerDistance -= info.Bmc.triggerDistance;
                    float            percent = info.Bmc.percent / info.Bmc.distance * info.Bmc.triggerDistance;
                    DamageFromAttack damage  = new DamageFromAttack(
                        new SourceHistory(Source.FromModifier(this)), percent, true, 1, 1,
                        casterEntity.Id, target.Position(), target.Position(),
                        characterStats, false, CastProjectileAction.DeathBehavior.Neutral,
                        true, true
                        ).CauseTargetToDie(false);
                    targetHealthComponent.ReceiveDamage(damage);
                    GameObject vfxPrefab = info.Bmc.ShowStoredPrefab();
                    if (vfxPrefab != null)
                    {
                        GameObject vfx = environment.InstantiateGameObject(vfxPrefab);
                        vfx.transform.position = target.Position();
                        vfxTransforms.Add(vfx.transform);

                        ParticleSystem[] ps = vfx.GetComponentsInChildren <ParticleSystem>();
                        if (ps != null && ps.Length > 0)
                        {
                            Timing.RunCoroutine(
                                _WaitForParticleSystemFinish(ps, () => GameObject.Destroy(vfx))
                                );
                        }
                        else
                        {
                            float waitTime = 1;
                            Timing.RunCoroutine(_WaitThenInvoke(waitTime, () => { GameObject.Destroy(vfx); }));
                        }
                    }
                }
            }
            lastPos = target.Position();

            foreach (Transform vfxTransform in vfxTransforms)
            {
                if (vfxTransform != null)
                {
                    vfxTransform.position = target.Position();
                }
            }
        }
        private void DealDamageToSelf()
        {
            Entity           casterEntity = caster.GameObject().GetComponent <EntityReference>().Entity;
            HealthComponent  hc           = casterEntity.GetComponent <HealthComponent>();
            StatsComponent   sc           = casterEntity.GetComponent <StatsComponent>();
            DamageFromAttack damage       = new DamageFromAttack(
                new SourceHistory(Source.FromSkill(skill, skillId)), config.damageScale, config.isHpPercent,
                1, 1, caster.Id(), caster.Position(), caster.Position(), sc.CharacterStats, false,
                config.ShowDeathBehavior()
                );

            damage.SetTriggerHud(config.hud);
            hc.ReceiveDamage(damage);
        }