using System; using System.IO; using System.Collections.Generic; using Server; using Server.Items; using Server.Custom.InnRooms; namespace Server.Custom.InnRooms { public enum InnRoomSize { Small, Medium, Large } // This object holds the coordinates for a single room from your config file public class RoomDefinition { public InnRoomSize Size; public Map RoomMap; public Point3D Location; } public class InnRoomManager { // The master list of all rooms loaded from the config file public static List Rooms = new List(); // This runs automatically when the server starts public static void Initialize() { LoadRooms(); } public static int GetCost(InnRoomSize size) { switch (size) { case InnRoomSize.Small: return 5000; case InnRoomSize.Medium: return 10000; case InnRoomSize.Large: return 20000; default: return 5000; } } public static void LoadRooms() { Rooms.Clear(); string filePath = Path.Combine(Core.BaseDirectory, "Data", "Config", "innrooms.cfg"); if (!File.Exists(filePath)) { Console.WriteLine("InnRoomManager: No innrooms.cfg found!"); return; } using (StreamReader ip = new StreamReader(filePath)) { string line; while ((line = ip.ReadLine()) != null) { line = line.Trim(); if (line.Length == 0 || line.StartsWith("#")) continue; string[] split = line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); // Expected Format: Size Map X Y Z // Example: Small Felucca 6000 6000 0 if (split.Length >= 5) { try { RoomDefinition def = new RoomDefinition(); def.Size = (InnRoomSize)Enum.Parse(typeof(InnRoomSize), split[0], true); def.RoomMap = Map.Parse(split[1]); def.Location = new Point3D(int.Parse(split[2]), int.Parse(split[3]), int.Parse(split[4])); Rooms.Add(def); } catch (Exception ex) { Console.WriteLine($"InnRoomManager Error parsing line: {line}\n{ex.Message}"); } } } } Console.WriteLine($"InnRoomManager: Loaded {Rooms.Count} total rooms from config."); } // Checks all active rentals on the server to see which list indexes are currently taken public static List GetOccupiedIndexes() { List occupied = new List(); foreach (Item item in World.Items.Values) { if (item is InnRoomHouse) { InnRoomHouse house = (InnRoomHouse)item; occupied.Add(house.RoomIndex); } } return occupied; } // Counts how many rooms of a specific size are NOT currently rented public static int GetAvailableCount(InnRoomSize size) { List occupied = GetOccupiedIndexes(); int count = 0; for (int i = 0; i < Rooms.Count; i++) { if (Rooms[i].Size == size && !occupied.Contains(i)) { count++; } } return count; } // Finds the exact list index of the first available room of the requested size public static int FindFirstOpenSlot(InnRoomSize size) { List occupied = GetOccupiedIndexes(); for (int i = 0; i < Rooms.Count; i++) { if (Rooms[i].Size == size && !occupied.Contains(i)) { return i; // Returns the exact index in the Rooms list } } return -1; // -1 means sold out } } }