2 // Radegast Metaverse Client
3 // Copyright (c) 2009, Radegast Development Team
4 // All rights reserved.
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are met:
9 // * Redistributions of source code must retain the above copyright notice,
10 // this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above copyright
12 // notice, this list of conditions and the following disclaimer in the
13 // documentation and/or other materials provided with the distribution.
14 // * Neither the name of the application "Radegast", nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 using System.Collections.Generic;
34 using System.Text.RegularExpressions;
35 using System.Windows.Forms;
39 namespace Radegast.Commands
41 public class TPCommand : RadegastCommand
43 TabsConsole TC { get { return Instance.TabConsole; } }
44 public static string FolderName = "Radegast Landmarks";
45 Inventory Inv { get { return Client.Inventory.Store; } }
47 public TPCommand(RadegastInstance instance)
51 Description = @"Teleport to a named landmark from ""{1}"" inventory folder";
52 Usage = "tp (list|landmark name|landmark number|help) (type \"" + CommandsManager.CmdPrefix + "tp help\" for full usage)";
56 public override void Dispose()
63 TC.DisplayNotificationInChat("Wrong arguments for \"tp\" command. For detailed description type: " + CommandsManager.CmdPrefix + "tp help");
68 TC.DisplayNotificationInChat(string.Format(@"Usage:
69 {0}tp (list|landmark name|landmark number|help)
72 Lists landmarks in ""{1}"" folder
77 Specifies name of the landmark to teleport to
79 {0}tp Latif's place -- teleports to a landmark whose name begins with ""Latif's place""
82 Teleport to landmark number specified
84 {0}tp 3 -- teleports to landmark number 3 as printed in {0}tp list output", CommandsManager.CmdPrefix, FolderName));
87 public override void Execute(string name, string[] cmdArgs, ConsoleWriteLine WriteLine)
89 InventoryFolder folder = (InventoryFolder)Inv.GetContents(Inv.RootFolder).Find((InventoryBase b) => { return b.Name == FolderName && b is InventoryFolder; });
92 Client.Inventory.CreateFolder(Inv.RootFolder.UUID, FolderName);
93 WriteLine(@"Could not find ""{0}"" folder in the inventory, creating one.", FolderName);
97 if (cmdArgs.Length == 0) { PrintUsage(); return; }
99 List<InventoryLandmark> landmarks = new List<InventoryLandmark>();
100 Inv.GetContents(folder)
101 .FindAll((InventoryBase b) => { return b is InventoryLandmark; })
102 .ForEach((InventoryBase l) => { landmarks.Add((InventoryLandmark)l); });
104 if (landmarks.Count == 0)
106 WriteLine(@"""{0}"" folder is empty, nothing to do.", FolderName);
110 string cmd = string.Join(" ", cmdArgs);
118 landmarks.Sort(new LMSorter());
122 StringBuilder sb = new StringBuilder();
123 sb.AppendLine("Landmarks:");
124 for (int i = 0; i < landmarks.Count; i++)
126 sb.AppendLine(string.Format("{0}. {1}", i + 1, landmarks[i].Name));
128 WriteLine(sb.ToString());
133 if (int.TryParse(cmd, out lmnr))
135 if (lmnr >= 1 && lmnr <= landmarks.Count)
137 WriteLine("Teleporting to {0}", landmarks[lmnr - 1].Name);
138 Client.Self.RequestTeleport(landmarks[lmnr - 1].AssetUUID);
142 WriteLine("Valid landmark number is between 1 and {0}", landmarks.Count);
147 InventoryLandmark lm = landmarks.Find((InventoryLandmark l) => { return l.Name.ToLower().StartsWith(cmd.ToLower()); });
150 WriteLine("Could not find landmark {0}, try {1}tp list", cmd, CommandsManager.CmdPrefix);
155 WriteLine("Teleporting to {0}", lm.Name);
156 Client.Self.RequestTeleport(lm.AssetUUID);
161 class LMSorter : IComparer<InventoryLandmark>
163 public int Compare(InventoryLandmark lm1, InventoryLandmark lm2)
165 return DateTime.Compare(lm1.CreationDate, lm2.CreationDate);