namespace Aeshnidae.LootTables; public static class Commands { [CommandHandler("loottables", AccessLevel.Developer, CommandHandlerFlag.None, 0, "How many code-side loot tables there are and which are overridden.", "/loottables")] public static void HandleStatus(Session session, params string[] parameters) { var file = Mod.Settings.ReadOverrides(Mod.ModPath); var sb = new StringBuilder($"{Mod.Name}: {Tables.All.Count} code-side loot tables, {file.Tables.Count} overridden"); foreach (var id in file.Tables.Keys.OrderBy(k => k)) sb.Append('\n').Append(" ").Append(id); Reply(session, sb.ToString()); } [CommandHandler("loottables-apply", AccessLevel.Developer, CommandHandlerFlag.None, 0, "Re-read the loot-table overrides and apply them (between landblock ticks). The staff site runs this after a save.", "/loottables-apply")] public static void HandleApply(Session session, params string[] parameters) { try { var result = Mod.ApplyNow(); var line = $"Loot tables applied: {result.Applied} overridden, the rest retail" + (result.Errors.Count > 0 ? $"; refused: {string.Join(" | ", result.Errors)}" : ""); Reply(session, line); ModManager.Log($"[{Mod.Name}] loottables-apply by {session?.Player?.Name ?? "console"}: {line}"); } catch (Exception ex) { Reply(session, $"Loot tables NOT applied: {ex.InnerException?.Message ?? ex.Message}"); ModManager.Log($"[{Mod.Name}] loottables-apply failed: {ex}", ModManager.LogLevel.Error); } } private static void Reply(Session? session, string message) { if (session?.Player is null) { ModManager.Log(message); return; } foreach (var line in message.Split('\n')) session.Player.SendMessage(line); } }