diff --git a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/LookupCommand.cs b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/LookupCommand.cs new file mode 100644 index 0000000..c161ed3 --- /dev/null +++ b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/LookupCommand.cs @@ -0,0 +1,280 @@ +using System.Collections.Generic; +using System.Linq; +using DiIiS_NA.Core.MPQ; +using DiIiS_NA.Core.MPQ.FileFormats; +using DiIiS_NA.GameServer.Core.Types.SNO; +using DiIiS_NA.GameServer.Core.Types.TagMap; +using DiIiS_NA.GameServer.GSSystem.ActorSystem; +using DiIiS_NA.LoginServer.Battle; + +namespace DiIiS_NA.GameServer.CommandManager; + +[CommandGroup("lookup", + "Searches in sno databases.\nUsage: lookup [actor|conv|power|scene|la|sp|weather] ")] +public class LookupCommand : CommandGroup +{ + [DefaultCommand] + public string Search(string[] @params, BattleClient invokerClient) + { + if (@params == null) + return Fallback(); + + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup actor' to get help."; + + var pattern = @params[0].ToLower(); + + foreach (var groupPair in MPQStorage.Data.Assets) matches.AddRange(from pair in groupPair.Value where pair.Value.Name.ToLower().Contains(pattern) select pair.Value); + + return matches.Aggregate(matches.Count >= 1 ? "Matches:\n" : "No matches found.", + (current, match) => + $"{current} [{match.SNOId:D6}] [{match.Group}] {match.Name}\n"); + } + + [Command("actor", "Allows you to search for an actor.\nUsage: lookup actor ")] + public string Actor(string[] @params, BattleClient invokerClient) + { + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup actor' to get help."; + + var pattern = @params[0].ToLower(); + + var matches = (from pair in MPQStorage.Data.Assets[SNOGroup.Actor] where pair.Value.Name.ToLower().Contains(pattern) select pair.Value).ToList(); + + return matches.Aggregate(matches.Count >= 1 ? "Actor Matches:\n" : "No match found.", + (current, match) => current + + $"[{match.SNOId:D6}] {match.Name} ({((ActorData)match.Data).Type} {(((ActorData)match.Data).Type == ActorType.Gizmo ? ((int)((ActorData)match.Data).TagMap[ActorKeys.GizmoGroup]).ToString() : "")})\n"); + } + + [Command("rope", "Allows you to search for an rope.\nUsage: lookup rope ")] + public string Rope(string[] @params, BattleClient invokerClient) + { + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup actor' to get help."; + + var pattern = @params[0].ToLower(); + + var matches = (from pair in MPQStorage.Data.Assets[SNOGroup.Rope] where pair.Value.Name.ToLower().Contains(pattern) select pair.Value).ToList(); + + return matches.Aggregate(matches.Count >= 1 ? "Rope Matches:\n" : "No match found.", + (current, match) => current + $"[{match.SNOId:D6}] {match.Name}\n"); + } + + [Command("conv", "Allows you to search for an conversation.\nUsage: lookup conv ")] + public string Conversation(string[] @params, BattleClient invokerClient) + { + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup actor' to get help."; + + var pattern = @params[0].ToLower(); + + var matches = (from pair in MPQStorage.Data.Assets[SNOGroup.Conversation] where pair.Value.Name.ToLower().Contains(pattern) select pair.Value).ToList(); + + return matches.Aggregate(matches.Count >= 1 ? "Conversation Matches:\n" : "No match found.", + (current, match) => current + $"[{match.SNOId:D6}] {match.Name}\n"); + } + + [Command("power", "Allows you to search for a power.\nUsage: lookup power ")] + public string Power(string[] @params, BattleClient invokerClient) + { + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup power' to get help."; + + if (@params[0].ToLower() == "id") + { + var num = int.Parse(@params[1]); + matches.AddRange(from pair in MPQStorage.Data.Assets[SNOGroup.Power] where pair.Value.SNOId == num select pair.Value); + } + else + { + var pattern = @params[0].ToLower(); + matches.AddRange(from pair in MPQStorage.Data.Assets[SNOGroup.Power] where pair.Value.Name.ToLower().Contains(pattern) select pair.Value); + } + + return matches.Aggregate(matches.Count >= 1 ? "World Matches:\n" : "No match found.", + (current, match) => current + + $"[{match.SNOId:D6}] {match.Name} - {((World)match.Data).DynamicWorld}\n"); + } + + [Command("world", + "Allows you to search for a world.\nUsage: lookup world OR lookup world id ")] + public string World(string[] @params, BattleClient invokerClient) + { + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup world' to get help."; + + if (@params[0].ToLower() == "id") + { + var num = int.Parse(@params[1]); + foreach (var pair in MPQStorage.Data.Assets[SNOGroup.Worlds]) + if (pair.Value.SNOId == num) + matches.Add(pair.Value); + } + else + { + var pattern = @params[0].ToLower(); + foreach (var pair in MPQStorage.Data.Assets[SNOGroup.Worlds]) + if (pair.Value.Name.ToLower().Contains(pattern)) + matches.Add(pair.Value); + } + + return matches.Aggregate(matches.Count >= 1 ? "World Matches:\n" : "No match found.", + (current, match) => current + + $"[{match.SNOId:D6}] {match.Name} - {(match.Data as World).DynamicWorld}\n"); + } + + [Command("qr", "Show QuestRange of an actor.\nUsage: lookup qr ")] + public string QuestRange(string[] @params, BattleClient invokerClient) + { + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup world' to get help."; + + var num = int.Parse(@params[0]); + var qr_id = "-1"; + var qr_name = "None"; + foreach (var pair in MPQStorage.Data.Assets[SNOGroup.QuestRange]) + if (pair.Value.SNOId == num) + { + qr_id = pair.Value.SNOId.ToString("D6"); + qr_name = pair.Value.Name; + } + + return $"[{qr_id}] {qr_name}"; + } + + public static int GetExitBits(Asset scene) + { + if (scene.Name.Contains("_N_")) return 1; + if (scene.Name.Contains("_S_")) return 2; + if (scene.Name.Contains("_NS_")) return 3; + if (scene.Name.Contains("_E_")) return 4; + if (scene.Name.Contains("_NE_")) return 5; + if (scene.Name.Contains("_SE_")) return 6; + if (scene.Name.Contains("_NSE_")) return 7; + if (scene.Name.Contains("_W_")) return 8; + if (scene.Name.Contains("_NW_")) return 9; + if (scene.Name.Contains("_SW_")) return 10; + if (scene.Name.Contains("_NSW_")) return 11; + if (scene.Name.Contains("_EW_")) return 12; + if (scene.Name.Contains("_NEW_")) return 13; + if (scene.Name.Contains("_SEW_")) return 14; + if (scene.Name.Contains("_NSEW_")) return 15; + return 0; + } + + [Command("la", "Allows you to search for a LevelArea.\nUsage: lookup la ")] + public string LevelArea(string[] @params, BattleClient invokerClient) + { + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup la' to get help."; + + var pattern = @params[0].ToLower(); + + foreach (var pair in MPQStorage.Data.Assets[SNOGroup.LevelArea]) + if (pair.Value.Name.ToLower().Contains(pattern)) + matches.Add(pair.Value); + + return matches.Aggregate(matches.Count >= 1 ? "LevelArea Matches:\n" : "No match found.", + (current, match) => current + $"[{match.SNOId:D6}] {match.Name}\n"); + } + + [Command("sp", "List all Starting Points in world.\nUsage: lookup sp")] + public string StartingPoint(string[] @params, BattleClient invokerClient) + { + var matches = invokerClient.InGameClient.Player.World.StartingPoints; + + return matches.Aggregate(matches.Count >= 1 ? "Starting Points:\n" : "No match found.", + (current, match) => current + + $"[{match.GlobalID.ToString("D6")}] {match.Name} - {match.TargetId}\n"); + } + + [Command("weather", "Allows you to search for a Weather.\nUsage: lookup weather ")] + public string Weather(string[] @params, BattleClient invokerClient) + { + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup weather' to get help."; + + var pattern = @params[0].ToLower(); + + foreach (var pair in MPQStorage.Data.Assets[SNOGroup.Weather]) + if (pair.Value.Name.ToLower().Contains(pattern)) + matches.Add(pair.Value); + + return matches.Aggregate(matches.Count >= 1 ? "Weather Matches:\n" : "No match found.", + (current, match) => current + $"[{match.SNOId:D6}] {match.Name}\n"); + } + + [Command("scene", "Allows you to search for a scene.\nUsage: lookup scene ")] + public string Scene(string[] @params, BattleClient invokerClient) + { + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup scene' to get help."; + + var pattern = @params[0].ToLower(); + + foreach (var pair in MPQStorage.Data.Assets[SNOGroup.Scene]) + if (pair.Value.Name.ToLower().Contains(pattern)) + matches.Add(pair.Value); + + return matches.Aggregate(matches.Count >= 1 ? "Scene Matches:\n" : "No match found.", + (current, match) => current + + $"[{match.SNOId:D6}] {match.Name} - {GetExitBits(match)}\n"); + } + + [Command("eg", "Allows you to search for an EffectGroup.\nUsage: lookup eg ")] + public string EffectGroup(string[] @params, BattleClient invokerClient) + { + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup eg' to get help."; + + var pattern = @params[0].ToLower(); + + foreach (var pair in MPQStorage.Data.Assets[SNOGroup.EffectGroup]) + if (pair.Value.Name.ToLower().Contains(pattern)) + matches.Add(pair.Value); + + return matches.Aggregate(matches.Count >= 1 ? "EffectGroup Matches:\n" : "No match found.", + (current, match) => current + + $"[{match.SNOId:D6}] {match.Name} - {GetExitBits(match)}\n"); + } + + [Command("item", "Allows you to search for an item.\nUsage: lookup item ")] + public string Item(string[] @params, BattleClient invokerClient) + { + var matches = new List(); + + if (!@params.Any()) + return "Invalid arguments. Type 'help lookup item' to get help."; + + var pattern = @params[0].ToLower(); + + foreach (var asset in MPQStorage.Data.Assets[SNOGroup.GameBalance].Values) + { + var data = asset.Data as GameBalance; + if (data == null || data.Type != GameBalance.BalanceType.Items) continue; + + foreach (var itemDefinition in data.Item) + if (itemDefinition.Name.ToLower().Contains(pattern)) + matches.Add(itemDefinition); + } + + return matches.Aggregate(matches.Count >= 1 ? "Item Matches:\n" : "No match found.", + (current, match) => current + $"[{match.SNOActor:D6}] {match.Name}\n"); + } +} \ No newline at end of file diff --git a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/QuestCommand.cs b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/QuestCommand.cs new file mode 100644 index 0000000..d0d90d7 --- /dev/null +++ b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/QuestCommand.cs @@ -0,0 +1,107 @@ +using System; +using DiIiS_NA.LoginServer.Battle; + +namespace DiIiS_NA.GameServer.CommandManager; + +[CommandGroup("quest", + "Retrieves information about quest states and manipulates quest progress.\n Usage: quest [triggers | trigger eventType eventValue | advance snoQuest]")] +public class QuestCommand : CommandGroup +{ + [DefaultCommand] + public string Quest(string[] @params, BattleClient invokerClient) + { + if (invokerClient == null) + return "You cannot invoke this command from console."; + + if (invokerClient.InGameClient == null) + return "You can only invoke this command while in-game."; + + return Info(@params, invokerClient); + } + + [Command("advance", "Advances a quest by a single step\n Usage: advance")] + public string Advance(string[] @params, BattleClient invokerClient) + { + try + { + invokerClient.InGameClient.Game.QuestManager.Advance(); + return "Advancing main quest line"; + } + catch (Exception e) + { + return e.Message; + } + } + + [Command("sideadvance", "Advances a side-quest by a single step\n Usage: sideadvance")] + public string SideAdvance(string[] @params, BattleClient invokerClient) + { + try + { + invokerClient.InGameClient.Game.QuestManager.SideAdvance(); + return "Advancing side quest line"; + } + catch (Exception e) + { + return e.Message; + } + } + + [Command("event", "Launches chosen side-quest by snoID\n Usage: event snoId")] + public string Event(string[] @params, BattleClient invokerClient) + { + if (@params == null) + return Fallback(); + + if (@params.Length != 1) + return "Invalid arguments. Type 'help text public' to get help."; + + var questId = int.Parse(@params[0]); + + try + { + invokerClient.InGameClient.Game.QuestManager.LaunchSideQuest(questId, true); + return "Advancing side quest line"; + } + catch (Exception e) + { + return e.Message; + } + } + + [Command("timer", "Send broadcasted text message.\n Usage: public 'message'")] + public string Timer(string[] @params, BattleClient invokerClient) + { + if (@params == null) + return Fallback(); + + if (@params.Length != 2) + return "Invalid arguments. Type 'help text public' to get help."; + + var eventId = int.Parse(@params[0]); + var duration = int.Parse(@params[1]); + + invokerClient.InGameClient.Game.QuestManager.LaunchQuestTimer(eventId, (float)duration, + new Action((q) => { })); + + return "Message sent."; + } + + [Command("info", "Retrieves information about quest states.\n Usage: info")] + public string Info(string[] @params, BattleClient invokerClient) + { + if (invokerClient?.InGameClient?.Game?.QuestManager is not {} questManager) + return "You can only invoke this command while in-game."; + + var act = questManager.CurrentAct; + var quest = questManager.Game.CurrentQuest; + var questStep = questManager.Game.CurrentStep; + var currentSideQuest = questManager.Game.CurrentSideQuest; + var currentSideQuestStep = questManager.Game.CurrentSideStep; + return $"Act: {act}\n" + + $"Quest: {quest}\n" + + $"Quest Step: {questStep}\n" + + $"Side Quest: {currentSideQuest}\n" + + $"Side Quest Step: {currentSideQuestStep}"; + } +} \ No newline at end of file diff --git a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/SpeedCommand.cs b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/SpeedCommand.cs index cfbda5e..f56f7d6 100644 --- a/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/SpeedCommand.cs +++ b/src/DiIiS-NA/D3-GameServer/CommandManager/Commands/SpeedCommand.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using DiIiS_NA.Core.MPQ; -using DiIiS_NA.Core.MPQ.FileFormats; -using DiIiS_NA.GameServer.Core.Types.SNO; -using DiIiS_NA.GameServer.Core.Types.TagMap; -using DiIiS_NA.GameServer.GSSystem.ActorSystem; +using System.Linq; using DiIiS_NA.GameServer.GSSystem.ObjectsSystem; using DiIiS_NA.GameServer.MessageSystem; using DiIiS_NA.LoginServer.Battle; @@ -53,377 +46,4 @@ public class SpeedCommand : CommandGroup playerSpeed.BroadcastChangedIfRevealed(); return $"Speed changed to {speedValue}"; } - - [CommandGroup("quest", - "Retrieves information about quest states and manipulates quest progress.\n Usage: quest [triggers | trigger eventType eventValue | advance snoQuest]")] - public class QuestCommand : CommandGroup - { - [DefaultCommand] - public string Quest(string[] @params, BattleClient invokerClient) - { - if (invokerClient == null) - return "You cannot invoke this command from console."; - - if (invokerClient.InGameClient == null) - return "You can only invoke this command while in-game."; - - return Info(@params, invokerClient); - } - - [Command("advance", "Advances a quest by a single step\n Usage: advance")] - public string Advance(string[] @params, BattleClient invokerClient) - { - try - { - invokerClient.InGameClient.Game.QuestManager.Advance(); - return "Advancing main quest line"; - } - catch (Exception e) - { - return e.Message; - } - } - - [Command("sideadvance", "Advances a side-quest by a single step\n Usage: sideadvance")] - public string SideAdvance(string[] @params, BattleClient invokerClient) - { - try - { - invokerClient.InGameClient.Game.QuestManager.SideAdvance(); - return "Advancing side quest line"; - } - catch (Exception e) - { - return e.Message; - } - } - - [Command("event", "Launches chosen side-quest by snoID\n Usage: event snoId")] - public string Event(string[] @params, BattleClient invokerClient) - { - if (@params == null) - return Fallback(); - - if (@params.Length != 1) - return "Invalid arguments. Type 'help text public' to get help."; - - var questId = int.Parse(@params[0]); - - try - { - invokerClient.InGameClient.Game.QuestManager.LaunchSideQuest(questId, true); - return "Advancing side quest line"; - } - catch (Exception e) - { - return e.Message; - } - } - - [Command("timer", "Send broadcasted text message.\n Usage: public 'message'")] - public string Timer(string[] @params, BattleClient invokerClient) - { - if (@params == null) - return Fallback(); - - if (@params.Length != 2) - return "Invalid arguments. Type 'help text public' to get help."; - - var eventId = int.Parse(@params[0]); - var duration = int.Parse(@params[1]); - - invokerClient.InGameClient.Game.QuestManager.LaunchQuestTimer(eventId, (float)duration, - new Action((q) => { })); - - return "Message sent."; - } - - [Command("info", "Retrieves information about quest states.\n Usage: info")] - public string Info(string[] @params, BattleClient invokerClient) - { - if (invokerClient?.InGameClient?.Game?.QuestManager is not {} questManager) - return "You can only invoke this command while in-game."; - - var act = questManager.CurrentAct; - var quest = questManager.Game.CurrentQuest; - var questStep = questManager.Game.CurrentStep; - var currentSideQuest = questManager.Game.CurrentSideQuest; - var currentSideQuestStep = questManager.Game.CurrentSideStep; - return $"Act: {act}\n" + - $"Quest: {quest}\n" + - $"Quest Step: {questStep}\n" + - $"Side Quest: {currentSideQuest}\n" + - $"Side Quest Step: {currentSideQuestStep}"; - } - } - - [CommandGroup("lookup", - "Searches in sno databases.\nUsage: lookup [actor|conv|power|scene|la|sp|weather] ")] - public class LookupCommand : CommandGroup - { - [DefaultCommand] - public string Search(string[] @params, BattleClient invokerClient) - { - if (@params == null) - return Fallback(); - - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup actor' to get help."; - - var pattern = @params[0].ToLower(); - - foreach (var groupPair in MPQStorage.Data.Assets) matches.AddRange(from pair in groupPair.Value where pair.Value.Name.ToLower().Contains(pattern) select pair.Value); - - return matches.Aggregate(matches.Count >= 1 ? "Matches:\n" : "No matches found.", - (current, match) => - $"{current} [{match.SNOId:D6}] [{match.Group}] {match.Name}\n"); - } - - [Command("actor", "Allows you to search for an actor.\nUsage: lookup actor ")] - public string Actor(string[] @params, BattleClient invokerClient) - { - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup actor' to get help."; - - var pattern = @params[0].ToLower(); - - var matches = (from pair in MPQStorage.Data.Assets[SNOGroup.Actor] where pair.Value.Name.ToLower().Contains(pattern) select pair.Value).ToList(); - - return matches.Aggregate(matches.Count >= 1 ? "Actor Matches:\n" : "No match found.", - (current, match) => current + - $"[{match.SNOId:D6}] {match.Name} ({((ActorData)match.Data).Type} {(((ActorData)match.Data).Type == ActorType.Gizmo ? ((int)((ActorData)match.Data).TagMap[ActorKeys.GizmoGroup]).ToString() : "")})\n"); - } - - [Command("rope", "Allows you to search for an rope.\nUsage: lookup rope ")] - public string Rope(string[] @params, BattleClient invokerClient) - { - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup actor' to get help."; - - var pattern = @params[0].ToLower(); - - var matches = (from pair in MPQStorage.Data.Assets[SNOGroup.Rope] where pair.Value.Name.ToLower().Contains(pattern) select pair.Value).ToList(); - - return matches.Aggregate(matches.Count >= 1 ? "Rope Matches:\n" : "No match found.", - (current, match) => current + $"[{match.SNOId:D6}] {match.Name}\n"); - } - - [Command("conv", "Allows you to search for an conversation.\nUsage: lookup conv ")] - public string Conversation(string[] @params, BattleClient invokerClient) - { - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup actor' to get help."; - - var pattern = @params[0].ToLower(); - - var matches = (from pair in MPQStorage.Data.Assets[SNOGroup.Conversation] where pair.Value.Name.ToLower().Contains(pattern) select pair.Value).ToList(); - - return matches.Aggregate(matches.Count >= 1 ? "Conversation Matches:\n" : "No match found.", - (current, match) => current + $"[{match.SNOId:D6}] {match.Name}\n"); - } - - [Command("power", "Allows you to search for a power.\nUsage: lookup power ")] - public string Power(string[] @params, BattleClient invokerClient) - { - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup power' to get help."; - - if (@params[0].ToLower() == "id") - { - var num = int.Parse(@params[1]); - matches.AddRange(from pair in MPQStorage.Data.Assets[SNOGroup.Power] where pair.Value.SNOId == num select pair.Value); - } - else - { - var pattern = @params[0].ToLower(); - matches.AddRange(from pair in MPQStorage.Data.Assets[SNOGroup.Power] where pair.Value.Name.ToLower().Contains(pattern) select pair.Value); - } - - return matches.Aggregate(matches.Count >= 1 ? "World Matches:\n" : "No match found.", - (current, match) => current + - $"[{match.SNOId:D6}] {match.Name} - {((World)match.Data).DynamicWorld}\n"); - } - - [Command("world", - "Allows you to search for a world.\nUsage: lookup world OR lookup world id ")] - public string World(string[] @params, BattleClient invokerClient) - { - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup world' to get help."; - - if (@params[0].ToLower() == "id") - { - var num = int.Parse(@params[1]); - foreach (var pair in MPQStorage.Data.Assets[SNOGroup.Worlds]) - if (pair.Value.SNOId == num) - matches.Add(pair.Value); - } - else - { - var pattern = @params[0].ToLower(); - foreach (var pair in MPQStorage.Data.Assets[SNOGroup.Worlds]) - if (pair.Value.Name.ToLower().Contains(pattern)) - matches.Add(pair.Value); - } - - return matches.Aggregate(matches.Count >= 1 ? "World Matches:\n" : "No match found.", - (current, match) => current + - $"[{match.SNOId:D6}] {match.Name} - {(match.Data as World).DynamicWorld}\n"); - } - - [Command("qr", "Show QuestRange of an actor.\nUsage: lookup qr ")] - public string QuestRange(string[] @params, BattleClient invokerClient) - { - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup world' to get help."; - - var num = int.Parse(@params[0]); - var qr_id = "-1"; - var qr_name = "None"; - foreach (var pair in MPQStorage.Data.Assets[SNOGroup.QuestRange]) - if (pair.Value.SNOId == num) - { - qr_id = pair.Value.SNOId.ToString("D6"); - qr_name = pair.Value.Name; - } - - return $"[{qr_id}] {qr_name}"; - } - - public static int GetExitBits(Asset scene) - { - if (scene.Name.Contains("_N_")) return 1; - if (scene.Name.Contains("_S_")) return 2; - if (scene.Name.Contains("_NS_")) return 3; - if (scene.Name.Contains("_E_")) return 4; - if (scene.Name.Contains("_NE_")) return 5; - if (scene.Name.Contains("_SE_")) return 6; - if (scene.Name.Contains("_NSE_")) return 7; - if (scene.Name.Contains("_W_")) return 8; - if (scene.Name.Contains("_NW_")) return 9; - if (scene.Name.Contains("_SW_")) return 10; - if (scene.Name.Contains("_NSW_")) return 11; - if (scene.Name.Contains("_EW_")) return 12; - if (scene.Name.Contains("_NEW_")) return 13; - if (scene.Name.Contains("_SEW_")) return 14; - if (scene.Name.Contains("_NSEW_")) return 15; - return 0; - } - - [Command("la", "Allows you to search for a LevelArea.\nUsage: lookup la ")] - public string LevelArea(string[] @params, BattleClient invokerClient) - { - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup la' to get help."; - - var pattern = @params[0].ToLower(); - - foreach (var pair in MPQStorage.Data.Assets[SNOGroup.LevelArea]) - if (pair.Value.Name.ToLower().Contains(pattern)) - matches.Add(pair.Value); - - return matches.Aggregate(matches.Count >= 1 ? "LevelArea Matches:\n" : "No match found.", - (current, match) => current + $"[{match.SNOId:D6}] {match.Name}\n"); - } - - [Command("sp", "List all Starting Points in world.\nUsage: lookup sp")] - public string StartingPoint(string[] @params, BattleClient invokerClient) - { - var matches = invokerClient.InGameClient.Player.World.StartingPoints; - - return matches.Aggregate(matches.Count >= 1 ? "Starting Points:\n" : "No match found.", - (current, match) => current + - $"[{match.GlobalID.ToString("D6")}] {match.Name} - {match.TargetId}\n"); - } - - [Command("weather", "Allows you to search for a Weather.\nUsage: lookup weather ")] - public string Weather(string[] @params, BattleClient invokerClient) - { - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup weather' to get help."; - - var pattern = @params[0].ToLower(); - - foreach (var pair in MPQStorage.Data.Assets[SNOGroup.Weather]) - if (pair.Value.Name.ToLower().Contains(pattern)) - matches.Add(pair.Value); - - return matches.Aggregate(matches.Count >= 1 ? "Weather Matches:\n" : "No match found.", - (current, match) => current + $"[{match.SNOId:D6}] {match.Name}\n"); - } - - [Command("scene", "Allows you to search for a scene.\nUsage: lookup scene ")] - public string Scene(string[] @params, BattleClient invokerClient) - { - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup scene' to get help."; - - var pattern = @params[0].ToLower(); - - foreach (var pair in MPQStorage.Data.Assets[SNOGroup.Scene]) - if (pair.Value.Name.ToLower().Contains(pattern)) - matches.Add(pair.Value); - - return matches.Aggregate(matches.Count >= 1 ? "Scene Matches:\n" : "No match found.", - (current, match) => current + - $"[{match.SNOId:D6}] {match.Name} - {GetExitBits(match)}\n"); - } - - [Command("eg", "Allows you to search for an EffectGroup.\nUsage: lookup eg ")] - public string EffectGroup(string[] @params, BattleClient invokerClient) - { - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup eg' to get help."; - - var pattern = @params[0].ToLower(); - - foreach (var pair in MPQStorage.Data.Assets[SNOGroup.EffectGroup]) - if (pair.Value.Name.ToLower().Contains(pattern)) - matches.Add(pair.Value); - - return matches.Aggregate(matches.Count >= 1 ? "EffectGroup Matches:\n" : "No match found.", - (current, match) => current + - $"[{match.SNOId:D6}] {match.Name} - {GetExitBits(match)}\n"); - } - - [Command("item", "Allows you to search for an item.\nUsage: lookup item ")] - public string Item(string[] @params, BattleClient invokerClient) - { - var matches = new List(); - - if (!@params.Any()) - return "Invalid arguments. Type 'help lookup item' to get help."; - - var pattern = @params[0].ToLower(); - - foreach (var asset in MPQStorage.Data.Assets[SNOGroup.GameBalance].Values) - { - var data = asset.Data as GameBalance; - if (data == null || data.Type != GameBalance.BalanceType.Items) continue; - - foreach (var itemDefinition in data.Item) - if (itemDefinition.Name.ToLower().Contains(pattern)) - matches.Add(itemDefinition); - } - - return matches.Aggregate(matches.Count >= 1 ? "Item Matches:\n" : "No match found.", - (current, match) => current + $"[{match.SNOActor:D6}] {match.Name}\n"); - } - } } \ No newline at end of file