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); } } } } }