using System; using System.Collections.Generic; using Server; using Server.Items; namespace Server.Items { // The class is now static, meaning it exists globally and not as an Item public static class FarmController { // Vegetable Plot Boundaries private static Rectangle2D CabbagePlot = new Rectangle2D(795, 771, 5, 4); private static Rectangle2D CarrotPlot = new Rectangle2D(795, 776, 5, 4); private static Rectangle2D LettucePlot = new Rectangle2D(795, 781, 5, 5); private static Rectangle2D OnionPlot = new Rectangle2D(801, 771, 5, 4); private static Rectangle2D TurnipPlot = new Rectangle2D(801, 776,5 ,4); private static Rectangle2D PumpkinPlot = new Rectangle2D(801, 781, 5, 5); private static Rectangle2D WheatPlot = new Rectangle2D(808, 771, 5, 4); private static Rectangle2D FlaxPlot = new Rectangle2D(808, 776, 5, 4); private static Rectangle2D CottonPlot = new Rectangle2D(808, 781, 5, 5); // Reagent Plot Boundaries //private static Rectangle2D ReagentRect = new Rectangle2D(820, 843, 23, 16); // Lists must be static now //private static List m_VeggieTypes = new List { typeof(FarmableCabbage), typeof(FarmableCarrot), typeof(FarmableCotton), typeof(FarmableFlax), typeof(FarmableLettuce), typeof(FarmableOnion), typeof(FarmablePumpkin), typeof(FarmableTurnip), typeof(FarmableWheat) }; //private static List m_ReagentTypes = new List { typeof(FarmableBlackPearl), typeof(FarmableBloodmoss), typeof(FarmableGarlic), typeof(FarmableGinseng), typeof(FarmableMandrakeRoot), typeof(FarmableNightshade), typeof(FarmableSpidersSilk), typeof(FarmableSulfurousAsh) }; // The core looks for 'Initialize' on startup and runs it automatically public static void Initialize() { double mySpawnVal = Server.ValidSettings.FarmSpawnTimer(); TimeSpan spawnInterval = TimeSpan.FromMinutes(mySpawnVal); // Start the global background timer Timer.DelayCall(spawnInterval, spawnInterval, SpawnTick); } private static void SpawnTick() { // Spawn 2 vegetables and 2 reagents each tick if space allows SpawnInArea(CabbagePlot, new List { typeof(FarmableCabbage) }, 1); SpawnInArea(CarrotPlot, new List { typeof(FarmableCarrot) }, 1); SpawnInArea(LettucePlot, new List { typeof(FarmableLettuce) }, 1); SpawnInArea(OnionPlot, new List { typeof(FarmableOnion) }, 1); SpawnInArea(TurnipPlot, new List { typeof(FarmableTurnip) }, 1); SpawnInArea(PumpkinPlot, new List { typeof(FarmablePumpkin) }, 1); SpawnInArea(WheatPlot, new List { typeof(FarmableWheat) }, 1); SpawnInArea(FlaxPlot, new List { typeof(FarmableFlax) }, 1); SpawnInArea(CottonPlot, new List { typeof(FarmableCotton) }, 1); } private static void SpawnInArea(Rectangle2D rect, List types, int count) { // Safety net for empty lists if (types == null || types.Count == 0) return; for (int i = 0; i < count; i++) { int x = Utility.Random(rect.X, rect.Width); int y = Utility.Random(rect.Y, rect.Height); Point3D loc = new Point3D(x, y, 0); bool occupied = false; // Get the items in range IPooledEnumerable eable = Map.Felucca.GetItemsInRange(loc, 0); // If the loop runs even once, something is there foreach (Item item in eable) { occupied = true; break; } // Free the pool to prevent memory leaks eable.Free(); // If the spot is empty, spawn the crop if (!occupied) { Type type = types[Utility.Random(types.Count)]; Item crop = (Item)Activator.CreateInstance(type); crop.MoveToWorld(loc, Map.Felucca); } } } } }