Exemple #1
0
        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;
                    }
                }
            }
        }