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