Exemple #1
0
        public void OnEvent(SubSpellEventArgs args)
        {
            if (args.Event != SubSpellEvent.OnFire)
            {
                return;
            }

            if (args.Query.NewTargetsQueryType == Query.QueryType.None)
            {
                return;
            }

            var source = args.Handler.Source;

            if (!(source.IsValid && source.HasPosition))
            {
                return;
            }

            var sourcePos   = source.Position;
            var orientation = Quaternion.LookRotation(source.Forward);

            orientation.x = orientation.z = 0;

            SpawnParticle(sourcePos,
                          orientation,
                          (args.Query.Area.Size.GetValue(args.Handler.Stacks) + args.Query.Area.MinSize.GetValue(args.Handler.Stacks)) * 0.5f,
                          args.Query.Area.Angle.GetValue(args.Handler.Stacks));
        }
        public void OnEvent(SubSpellEventArgs args)
        {
            if (args.Event == SubSpellEvent.Ended)
            {
                OnEndSubSpell(args.Handler);
                return;
            }

            if (args.Event == SpawnEvent)
            {
                if (InstancingMode == EffectInstancingMode.OnePerSubSpell)
                {
                    var existingInstanceIdx = _instances.FindIndex(i => i.Handler.Equals(args.Handler));
                    if (existingInstanceIdx >= 0)
                    {
                        // Skip existing ???
                    }
                    else
                    {
                        _instances.Add(Create(args.Handler, args.Handler.Source, args.Handler.Target));
                    }
                }
                else if (InstancingMode == EffectInstancingMode.OnePerEventTarget)
                {
                    foreach (var target in args.QueriedTargets)
                    {
                        _instances.Add(Create(args.Handler, args.Handler.Source, target));
                    }
                }
            }
        }
        public void OnEvent(SubSpellEventArgs args)
        {
            // If it is not a spawn event -> do nothing
            if (args.Event != SpawnEvent)
            {
                return;
            }

            switch (Origin)
            {
            case EffectOrigin.InSource:
                SpawnEffect(args.Handler.Source, Quaternion.identity);
                break;

            case EffectOrigin.InTarget:
                SpawnEffect(args.Handler.Target, Quaternion.identity);
                break;

            case EffectOrigin.InOriginalSpellSource:
                SpawnEffect(args.Handler.SpellHandler.Source, Quaternion.identity);
                break;

            case EffectOrigin.InOriginalSpellCastTarget:
                SpawnEffect(args.Handler.SpellHandler.CastTarget, Quaternion.identity);
                break;

            case EffectOrigin.InEachQueriedTargets:
                if (args.QueriedTargets == null)
                {
                    break;
                }
                foreach (var target in args.QueriedTargets)
                {
                    SpawnEffect(target, GetRotation(args.Handler.Source, target));
                }
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        public void OnEvent(SubSpellEventArgs args)
        {
            if (args.Event == SubSpellEvent.Ended)
            {
                OnEndSubSpell(args.Handler);
                return;
            }

            if (args.Event != SpawnEvent)
            {
                return;
            }

            if (InstanceMode == EffectInstancingMode.OnePerSubSpell)
            {
                // If the mode is one per subspell than we need to find existing one
                // and update its target information. And also raise its UpdateEvent
                var existingInstanceIdx = _instances.FindIndex(i => i.Handler.Equals(args.Handler));
                if (existingInstanceIdx >= 0)
                {
                    var existing = _instances[existingInstanceIdx];
                    var instance = new SubSpellEffectInstance
                    {
                        InstanceObject = existing.InstanceObject,
                        Target         = args.Handler.Target,
                        Source         = args.Handler.Source,
                        Handler        = args.Handler,
                        Ray            = existing.Ray
                    };
                    _instances[existingInstanceIdx] = instance;

                    GetRayStartAndEnd(instance, out var src, out var dst);
                    instance.Ray?.RayUpdated(src, dst);
                }
                else
                {
                    // If no existing instance is found, create new
                    CreateRayEffectInstance(out var gameObjectInstance, out var ray);
                    if (ray != null)
                    {
                        var instance = new SubSpellEffectInstance
                        {
                            InstanceObject = gameObjectInstance,
                            Target         = args.Handler.Target,
                            Source         = args.Handler.Source,
                            Handler        = args.Handler,
                            Ray            = ray
                        };
                        _instances.Add(instance);
                        GetRayStartAndEnd(instance, out var src, out var dst);
                        instance.Ray?.RayStarted(src, dst);
                    }
                }
            }
            else if (InstanceMode == EffectInstancingMode.OnePerEventTarget)
            {
                if (args.QueriedTargets != null)
                {
                    foreach (var target in args.QueriedTargets)
                    {
                        CreateRayEffectInstance(out var gameObjectInstance, out var ray);
                        if (ray != null)
                        {
                            var instance = new SubSpellEffectInstance
                            {
                                Ray            = ray,
                                InstanceObject = gameObjectInstance,
                                Source         = args.Handler.Source,
                                Target         = target,
                                Handler        = args.Handler
                            };
                            _instances.Add(instance);
                            GetRayStartAndEnd(instance, out var src, out var dst);
                            ray.RayStarted(src, dst);
                        }
                    }
                }
            }
        }