Ejemplo n.º 1
0
            private static TrackedProjectile AddProjectile(ProjectileOptions projectileOptions, float startTime, Vector3 sourcePosition, Vector3 location)
            {
                Log.Debug($"Creating projectile ({projectileOptions.effectName})...");
                float             targetVariance    = projectileOptions.targetVariance;
                TrackedProjectile trackedProjectile = new TrackedProjectile();

                trackedProjectile.StartTime                = startTime;
                trackedProjectile.EffectName               = projectileOptions.effectName;
                trackedProjectile.SpellId                  = projectileOptions.spellId;
                trackedProjectile.FireCollisionEventOn     = projectileOptions.fireCollisionEventOn;
                trackedProjectile.SourcePosition           = sourcePosition;
                trackedProjectile.SpeedFeetPerSecond       = projectileOptions.speed;
                trackedProjectile.IntendedTargetPosition   = location;
                trackedProjectile.ActualTargetPosition     = new Vector3(location.x + targetVariance * DistanceVariance, location.y + targetVariance * DistanceVariance, location.z + targetVariance * DistanceVariance);
                trackedProjectile.ProjectileSize           = projectileOptions.projectileSize;
                trackedProjectile.ProjectileSizeMultiplier = projectileOptions.projectileSizeMultiplier;
                trackedProjectile.BezierPathMultiplier     = projectileOptions.bezierPathMultiplier;

                if (!allProjectiles.ContainsKey(projectileOptions.spellId))
                {
                    allProjectiles.Add(projectileOptions.spellId, new List <TrackedProjectile>());
                }

                trackedProjectile.Initialize();
                allProjectiles[projectileOptions.spellId].Add(trackedProjectile);
                return(trackedProjectile);
            }
Ejemplo n.º 2
0
            public static void LaunchProjectile(ProjectileOptions projectileOptions)
            {
                Log.Warning($"------------------------------------------------------------------");
                Log.Debug($"LaunchProjectile:");
                float startTime = Time.time;

                UnityEngine.Random.InitState((int)startTime * 1000);
                Vector3 sourcePosition = Minis.GetHitTargetVector(projectileOptions.taleSpireId);

                int missilesRemaining = projectileOptions.count;

                Log.Debug($"missilesRemaining: {missilesRemaining}");
                lock (lockTrackedProjectiles)
                {
                    LaunchMissiles(projectileOptions, ref startTime, sourcePosition, ref missilesRemaining);
                    while (projectileOptions.kind == ProjectileKind.DistributeAmongAllTargets && missilesRemaining > 0)
                    {
                        LaunchMissiles(projectileOptions, ref startTime, sourcePosition, ref missilesRemaining);
                    }
                }
            }
Ejemplo n.º 3
0
            private static void LaunchMissiles(ProjectileOptions projectileOptions, ref float startTime, Vector3 sourcePosition, ref int missilesRemaining)
            {
                if (projectileOptions.targetLocations == null)
                {
                    Log.Error($"projectileOptions.targetLocations is null!");
                    missilesRemaining = 0;
                    return;
                }

                if (projectileOptions.targetLocations.Count == 0)
                {
                    Log.Error($"projectileOptions.targetLocations.Count == 0!");
                    missilesRemaining = 0;
                    return;
                }
                TrackedProjectile lastProjectileAdded  = null;
                TrackedProjectile firstProjectileAdded = null;

                foreach (Vector3 location in projectileOptions.targetLocations)
                {
                    //  projectileOptions.kind (ToVolume, DistributeAmongAllTargets, or EachTarget)
                    //	projectileOptions.fireCollisionEventOn (FirstImpact, EachImpact, LastImpact)
                    if (projectileOptions.kind == ProjectileKind.EachTarget)
                    {
                        Log.Debug($"ProjectileKind.EachTarget...");
                        float saveStartTime = startTime;
                        for (int i = 0; i < projectileOptions.count; i++)
                        {
                            Log.Vector("Target's intended location", location);
                            lastProjectileAdded = AddProjectile(projectileOptions, startTime, sourcePosition, location);
                            if (firstProjectileAdded == null)
                            {
                                firstProjectileAdded = lastProjectileAdded;
                            }
                            startTime += projectileOptions.launchTimeVariance * TimeVariance;
                        }
                        startTime = (startTime + saveStartTime) / 2;
                    }
                    else if (projectileOptions.kind == ProjectileKind.ToVolume)
                    {
                        Log.Debug($"ProjectileKind.ToVolume...");
                        Log.Error($"Cannot project to volume yet - we need to know the shape!");
                    }
                    else if (projectileOptions.kind == ProjectileKind.DistributeAmongAllTargets)
                    {
                        Log.Debug($"ProjectileKind.DistributeAmongAllTargets...");
                        missilesRemaining--;
                        lastProjectileAdded = AddProjectile(projectileOptions, startTime, sourcePosition, location);
                        if (firstProjectileAdded == null)
                        {
                            firstProjectileAdded = lastProjectileAdded;
                        }
                        startTime += projectileOptions.launchTimeVariance * TimeVariance;
                        if (missilesRemaining <= 0)
                        {
                            break;
                        }
                    }
                }
                firstProjectileAdded.IsFirst = true;
                if (lastProjectileAdded != null)
                {
                    lastProjectileAdded.IsLast = true;
                }
            }