public virtual void PerformSpawns(int spawnsNeeded) { for (int a = 0; a < spawnsNeeded; a++) { bool spawnCreated = false; for (int b = 0; b < 25; b++) { if (spawnCreated) { break; } Point3D newLocation = new Point3D(); int x = X; int xOffset = Utility.RandomMinMax(0, SpawnRange); if (Utility.RandomDouble() >= .5) { xOffset *= -1; } x += xOffset; int y = Y; int yOffset = Utility.RandomMinMax(0, SpawnRange); if (Utility.RandomDouble() >= .5) { yOffset *= -1; } y += yOffset; newLocation.X = x; newLocation.Y = y; newLocation.Z = Z; SpellHelper.AdjustField(ref newLocation, Map, 12, false); UOACZSpawnRedirector spawnRedirector = null; if (!IgnoreRedirector) { foreach (UOACZSpawnRedirector redirector in UOACZSpawnRedirector.m_Instances) { if (!UOACZRegion.ContainsItem(redirector)) { continue; } if (Utility.GetDistance(redirector.Location, newLocation) <= redirector.TriggerRadius) { spawnRedirector = redirector; break; } } } if (spawnRedirector != null) { newLocation.X = spawnRedirector.Location.X + Utility.RandomMinMax(-1 * spawnRedirector.TriggerRadius, spawnRedirector.TriggerRadius); newLocation.Y = spawnRedirector.Location.Y + Utility.RandomMinMax(-1 * spawnRedirector.TriggerRadius, spawnRedirector.TriggerRadius); newLocation.Z = spawnRedirector.Location.Z; int redirectionX = 0; int redirectionY = 0; switch (Utility.RandomMinMax(1, 3)) { case 1: redirectionX = Utility.RandomMinMax(spawnRedirector.MinRedirection, spawnRedirector.MaxRedirection); if (Utility.RandomDouble() <= .5) { redirectionX *= -1; } newLocation.X = spawnRedirector.Location.X + redirectionX; break; case 2: redirectionY = Utility.RandomMinMax(spawnRedirector.MinRedirection, spawnRedirector.MaxRedirection); if (Utility.RandomDouble() <= .5) { redirectionY *= -1; } newLocation.Y = spawnRedirector.Location.Y + redirectionY; break; case 3: redirectionX = Utility.RandomMinMax(spawnRedirector.MinRedirection, spawnRedirector.MaxRedirection); if (Utility.RandomDouble() <= .5) { redirectionX *= -1; } newLocation.X = spawnRedirector.Location.X + redirectionX; redirectionY = Utility.RandomMinMax(spawnRedirector.MinRedirection, spawnRedirector.MaxRedirection); if (Utility.RandomDouble() <= .5) { redirectionY *= -1; } newLocation.Y = spawnRedirector.Location.Y + redirectionY; break; } SpellHelper.AdjustField(ref newLocation, Map, 12, false); } bool areaIsBlocked = false; foreach (UOACZSpawnAreaBlocker spawnAreaBlocker in UOACZSpawnAreaBlocker.m_Instances) { if (!UOACZRegion.ContainsItem(spawnAreaBlocker)) { continue; } if (spawnAreaBlocker.BlockedArea.Contains(newLocation)) { areaIsBlocked = true; break; } } if (areaIsBlocked) { continue; } if (UOACZSystem.IsValidSpawnLocation(newLocation, Map, CheckSpawnForAdjacentBlocking)) { Spawn(newLocation, Map); TotalSpawnsOccured++; m_LastActivity = DateTime.UtcNow; spawnCreated = true; } } } }