예제 #1
0
            public void AuraApplied(IVisibleAura visibleAura)
            {
                aurasByAuraId.Insert(visibleAura.AuraId, visibleAura);

                if (effectByAuraId.ContainsKey(visibleAura.AuraId))
                {
                    return;
                }

                if (!unitRenderer.rendering.AuraVisuals.TryGetValue(visibleAura.AuraId, out AuraVisualsInfo settings))
                {
                    return;
                }

                if (settings.PreventAnimation)
                {
                    HandleAnimationPreventingAuras(visibleAura, true);
                }

                if (settings.EffectSettings == null)
                {
                    return;
                }

                Vector3       effectDirection = Vector3.ProjectOnPlane(unitRenderer.transform.forward, Vector3.up);
                Quaternion    effectRotation  = Quaternion.LookRotation(effectDirection);
                IEffectEntity newEffect       = settings.EffectSettings.PlayEffect(unitRenderer.transform.position, effectRotation, out long playId);

                if (newEffect != null)
                {
                    unitRenderer.TagContainer.ApplyPositioning(newEffect, settings);
                    effectByAuraId[visibleAura.AuraId] = new SpellVisualAuraState(playId, newEffect);
                }
            }
예제 #2
0
        protected override void OnUpdate(IEffectEntity effectEntity, ref bool keepAlive)
        {
            base.OnUpdate(effectEntity, ref keepAlive);

            if (cameraReference.WarcraftCamera != null)
            {
                Quaternion lookDirectionOffset      = Quaternion.Euler(rotationOffset);
                Vector3    projectedCameraDirection = Vector3.ProjectOnPlane(cameraReference.WarcraftCamera.transform.forward, Vector3.up);
                transformToRotate.rotation = Quaternion.LookRotation(projectedCameraDirection) * lookDirectionOffset;
            }
        }
        protected override void OnUpdate(IEffectEntity effectEntity, ref bool keepAlive)
        {
            base.OnUpdate(effectEntity, ref keepAlive);

            if (effectEntity.IsPlaying(PlayId))
            {
                keepAlive = true;
            }
            else if (hasFadeState && effectEntity.IsFading(PlayId) && fadeHash == animator.GetCurrentAnimatorStateInfo(0).shortNameHash)
            {
                keepAlive = true;
            }
        }
예제 #4
0
        private void OnSpellLaunch(Unit caster, int spellId, SpellProcessingToken processingToken)
        {
            if (!balance.SpellInfosById.TryGetValue(spellId, out SpellInfo spellInfo))
            {
                return;
            }

            if (!unitRendererController.TryFind(caster.Id, out UnitRenderer casterRenderer))
            {
                return;
            }

            if (!spellInfo.HasAttribute(SpellCustomAttributes.CastWithoutAnimation))
            {
                casterRenderer.TriggerInstantCast();
            }

            if (!SpellVisuals.TryGetValue(spellId, out SpellVisualsInfo spellVisuals))
            {
                return;
            }

            if (spellVisuals.VisualsByUsage.TryGetValue(EffectSpellSettings.UsageType.Projectile, out EffectSpellSettings settings))
            {
                foreach (var entry in processingToken.ProcessingEntries)
                {
                    if (unitRendererController.TryFind(entry.Item1, out UnitRenderer targetRenderer))
                    {
                        spellVisualController.SpawnVisual(casterRenderer, targetRenderer, settings, processingToken.ServerFrame, entry.Item2);
                    }
                }
            }

            if (spellVisuals.VisualsByUsage.TryGetValue(EffectSpellSettings.UsageType.Cast, out EffectSpellSettings spellVisualEffect))
            {
                IEffectEntity effectEntity = spellVisualEffect.EffectSettings.PlayEffect(processingToken.Source + Vector3.up, caster.Rotation);
                if (effectEntity != null && !spellInfo.HasAttribute(SpellCustomAttributes.LaunchSourceIsExplicit))
                {
                    effectEntity.ApplyPositioning(casterRenderer.TagContainer, spellVisualEffect);
                }
            }

            if (spellInfo.ExplicitTargetType == SpellExplicitTargetType.Destination)
            {
                if (spellVisuals.VisualsByUsage.TryGetValue(EffectSpellSettings.UsageType.Destination, out EffectSpellSettings destinationEffect))
                {
                    destinationEffect.EffectSettings.PlayEffect(processingToken.Destination + Vector3.up, caster.Rotation);
                }
            }
        }
예제 #5
0
        protected override void OnUpdate(IEffectEntity effectEntity, ref bool keepAlive)
        {
            base.OnUpdate(effectEntity, ref keepAlive);

            if (effectEntity.IsPlaying(PlayId) && effectEntity.KeepAliveWithNoParticles)
            {
                keepAlive = true;
            }
            else
            {
                foreach (ParticleSystem system in trackedParticleSystems)
                {
                    keepAlive |= system.IsAlive(false);
                }
            }
        }
예제 #6
0
                public bool HandleLaunch(UnitRenderer caster)
                {
                    Vector3 forward = TargetRenderer.transform.position - caster.transform.position;

                    projectile = Settings.EffectSettings.PlayEffect(Vector3.zero, Quaternion.LookRotation(forward), out long newPlayId);

                    if (projectile != null)
                    {
                        casterLaunchPosition = caster.TagContainer.FindDefaultLaunchTag();
                        caster.TagContainer.ApplyPositioning(projectile, Settings);
                        playId = newPlayId;
                        return(true);
                    }

                    return(false);
                }
예제 #7
0
        private void OnSpellHit(Unit target, int spellId)
        {
            if (!unitRendererController.TryFind(target.Id, out UnitRenderer targetRenderer))
            {
                return;
            }

            if (!SpellVisuals.TryGetValue(spellId, out SpellVisualsInfo spellVisuals))
            {
                return;
            }

            if (spellVisuals.VisualsByUsage.TryGetValue(EffectSpellSettings.UsageType.Impact, out EffectSpellSettings spellVisualEffect))
            {
                IEffectEntity effectEntity = spellVisualEffect.EffectSettings.PlayEffect(target.Position, target.Rotation);
                effectEntity?.ApplyPositioning(targetRenderer.TagContainer, spellVisualEffect);
            }
        }
        public void ApplyPositioning(IEffectEntity effectEntity, IEffectPositionerSettings settings)
        {
            Transform targetTag;

            switch (settings.EffectTagType)
            {
            case EffectTagType.Bottom:
                targetTag = bottomTag ?? defaultTag;
                break;

            case EffectTagType.Foot:
                targetTag = footTag ?? defaultTag;
                break;

            case EffectTagType.Impact:
                targetTag = impactTag ?? defaultTag;
                break;

            case EffectTagType.ImpactStatic:
                targetTag = impactStaticTag ?? defaultTag;
                break;

            case EffectTagType.RightHand:
                targetTag = rightHandTag ?? defaultTag;
                break;

            case EffectTagType.LeftHand:
                targetTag = leftHandTag ?? defaultTag;
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(settings.EffectTagType));
            }

            if (settings.AttachToTag)
            {
                effectEntity.Transform.SetParent(targetTag);
            }

            effectEntity.KeepAliveWithNoParticles = settings.KeepAliveWithNoParticles;
            effectEntity.KeepOriginalRotation     = settings.KeepOriginalRotation;
            effectEntity.Transform.position       = targetTag.position;
        }
예제 #9
0
 protected virtual void OnUpdate(IEffectEntity effectEntity, ref bool keepAlive)
 {
 }
예제 #10
0
 internal void DoUpdate(IEffectEntity effectEntity, ref bool keepAlive) => OnUpdate(effectEntity, ref keepAlive);
예제 #11
0
 public SpellVisualAuraState(long playId, IEffectEntity effectEntity)
 {
     PlayId       = playId;
     EffectEntity = effectEntity;
 }
예제 #12
0
 public static void ApplyPositioning(this IEffectEntity effectEntity, IEffectPositioner positioner, IEffectPositionerSettings settings)
 {
     positioner.ApplyPositioning(effectEntity, settings);
 }