namespace Holo.Managers { using Holo; using Ion.Storage; using System; using System.Collections; using System.Data; using System.Runtime.InteropServices; using System.Text; using System.Threading; public class catalogueManager { private static Hashtable cataloguePages; private static Hashtable itemCache; private static void cachePage(int pageID) { DataRow row; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { row = client.getRow("SELECT indexname,minrank,displayname,style_layout,img_header,img_side,label_description,label_misc,label_moredetails,page_brother,content_else,header_else FROM catalogue_pages WHERE indexid = '" + pageID + "'"); } if ((pageID <= 0) || (row.Table.Rows.Count != 0)) { DataTable table; object[] itemArray = row.ItemArray; string[] strArray = new string[itemArray.Length]; for (int i = 0; i < strArray.Length; i++) { strArray[i] = itemArray[i].ToString(); } string key = ""; StringBuilder builder = new StringBuilder(); cataloguePage page = new cataloguePage(); if (pageID > 0) { key = strArray[0]; page.displayName = strArray[2]; page.minRank = Convert.ToByte(bool.Parse(strArray[1])); if (strArray[10] != "") { builder.Append(strArray[10]); page.pageData = builder.ToString(); cataloguePages.Add(key, page); return; } if (strArray[11] != "") { builder.Append(strArray[11]); } else { builder.Append(strArray[3] + Convert.ToChar(2)); if (strArray[4] != "") { builder.Append("K" + strArray[4] + Convert.ToChar(2)); } if (strArray[5] != "") { builder.Append(strArray[5] + Convert.ToChar(2) + Convert.ToChar(2)); } if (strArray[6] != "") { builder.Append("K" + strArray[6] + Convert.ToChar(2)); } if (strArray[7] != "") { builder.Append(strArray[8] + Convert.ToChar(2)); } builder.Append(strArray[7] + Convert.ToChar(2)); if (strArray[9] != "") { string[] strArray2 = strArray[9].Split(new char[] { Convert.ToChar(2) }); for (int j = 0; j < strArray2.Length; j++) { builder.Append(strArray2[j] + Convert.ToChar(2)); } } } } using (DatabaseClient client2 = Eucalypt.dbManager.GetClient()) { table = client2.getTable("SELECT tid, typeid, length, width, catalogue_cost_credits, catalogue_cost_pixels, door, tradeable, recycleable, name_cct, colour, top, status_max, next_to_required, rights_required, drink_ids FROM catalogue_items WHERE catalogue_id_page = '" + pageID + "' ORDER BY catalogue_id_index ASC"); } int count = table.Rows.Count; int[] numArray = new int[count]; int[] numArray2 = new int[count]; int[] numArray3 = new int[count]; int[] numArray4 = new int[count]; int[] numArray5 = new int[count]; int[] numArray6 = new int[count]; int[] numArray7 = new int[count]; int[] numArray8 = new int[count]; int[] numArray9 = new int[count]; int[] numArray10 = new int[count]; int[] numArray11 = new int[count]; int[] numArray12 = new int[count]; string[] strArray3 = new string[count]; string[] strArray4 = new string[count]; string[] strArray5 = new string[count]; string[] strArray6 = new string[count]; string[] strArray7 = new string[count]; int[] numArray13 = new int[count]; int index = 0; foreach (DataRow row2 in table.Rows) { numArray[index] = Convert.ToInt32(row2["tid"]); numArray2[index] = Convert.ToInt32(row2["typeid"]); numArray3[index] = Convert.ToInt32(row2["length"]); numArray4[index] = Convert.ToInt32(row2["width"]); numArray5[index] = Convert.ToInt32(row2["catalogue_cost_credits"]); numArray6[index] = Convert.ToInt32(row2["catalogue_cost_pixels"]); numArray7[index] = Convert.ToInt32(row2["door"]); numArray8[index] = Convert.ToInt32(row2["tradeable"]); numArray9[index] = Convert.ToInt32(row2["recycleable"]); strArray4[index] = Convert.ToString(row2["name_cct"]); strArray5[index] = Convert.ToString(row2["colour"]); strArray6[index] = Convert.ToString(row2["top"]); numArray10[index] = Convert.ToInt32(row2["status_max"]); numArray11[index] = Convert.ToInt32(row2["next_to_required"]); numArray12[index] = Convert.ToInt32(row2["rights_required"]); strArray7[index] = Convert.ToString(row2["drink_ids"]); string[] strArray8 = strArray4[index].Split(new char[] { ' ' }); using (DatabaseClient client3 = Eucalypt.dbManager.GetClient()) { strArray3[index] = ""; if (strArray4[index].Contains("wallpaper")) { strArray3[index] = strArray4[index].Replace("wallpaper ", ""); strArray4[index] = "wallpaper"; } else if (strArray4[index].Contains("landscape")) { strArray3[index] = strArray4[index].Replace("landscape ", ""); strArray4[index] = "landscape"; } if (strArray8[0] == "poster") { strArray4[index] = strArray8[0]; strArray3[index] = strArray8[1]; } numArray13[index] = client3.getInt("SELECT id FROM furniture_data WHERE sprite = '" + strArray4[index] + "' LIMIT 1"); if (strArray4[index] == "wallpaper") { strArray4[index] = "wallpaper " + strArray3[index]; } else if (strArray4[index] == "poster") { string[] strArray9; IntPtr ptr; (strArray9 = strArray4)[(int) (ptr = (IntPtr) index)] = strArray9[(int) ptr] + " " + strArray8[1]; } else if (strArray4[index] == "landscape") { strArray4[index] = "landscape " + strArray3[index]; } } index++; } builder.Append(Holo.Encoding.encodeVL64(table.Rows.Count)); for (index = 0; index < numArray.Length; index++) { if (stringManager.getStringPart(strArray4[index], 0, 4) != "deal") { itemCache.Add(numArray[index], new itemTemplate(strArray4[index], Convert.ToByte(numArray2[index]), strArray5[index], numArray3[index], numArray4[index], double.Parse(strArray6[index]), numArray7[index] == 1, numArray8[index] == 1, numArray9[index] == 1, numArray10[index], numArray11[index], numArray12[index], strArray7[index], numArray13[index])); if (pageID != -1) { if (numArray13[index] == 0) { builder.Append(string.Concat(new object[] { Holo.Encoding.encodeVL64(numArray[index]), strArray4[index], Convert.ToChar(2), Holo.Encoding.encodeVL64(numArray5[index]), Holo.Encoding.encodeVL64(numArray6[index]), "I" })); } else { builder.Append(string.Concat(new object[] { Holo.Encoding.encodeVL64(numArray[index]), strArray4[index], Convert.ToChar(2), Holo.Encoding.encodeVL64(numArray5[index]), Holo.Encoding.encodeVL64(numArray6[index]), "I" })); } if (numArray2[index] == 0) { builder.Append("i"); } else if (strArray4[index].Contains("avatar_effect")) { builder.Append("e"); } else { builder.Append("s"); } if (strArray4[index].Contains("avatar_effect")) { builder.Append(string.Concat(new object[] { Convert.ToChar(2), Holo.Encoding.encodeVL64(int.Parse(strArray4[index].Replace("avatar_effect", ""))), Convert.ToChar(2), "IPO" })); } else { builder.Append(string.Concat(new object[] { Convert.ToChar(2), Holo.Encoding.encodeVL64(numArray13[index]), strArray3[index], Convert.ToChar(2), "IM" })); } } } } if (pageID != -1) { page.pageData = builder.ToString(); cataloguePages.Add(key, page); } } } public static string getPage(string pageName, byte userRank) { try { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { pageName = client.getString("SELECT indexname FROM catalogue_pages WHERE indexid = '" + Holo.Encoding.decodeVL64(pageName) + "'"); } cataloguePage page = (cataloguePage) cataloguePages[pageName]; if (userRank < page.minRank) { return ""; } return page.pageData; } catch { return ""; } } public static bool getPageExists(string pageName) { return cataloguePages.ContainsKey(cataloguePages.ContainsKey(pageName)); } public static string getPageIndex(byte userRank) { string str; try { StringBuilder builder = new StringBuilder(); using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { string[] strArray = dataHandling.dColToArray(client.getColumn("SELECT indexname FROM catalogue_categories WHERE minrank <= '" + userRank + "' ORDER BY indexid ASC")); int i = 0; int num2 = 0; int num3 = 0; int num4 = 0; int num5 = 0; int num6 = 0; int num7 = 0; bool flag = true; string str2 = ""; string str3 = ""; num5 = client.getInt("SELECT COUNT(indexname) FROM catalogue_categories WHERE minrank <= '" + userRank + "'"); for (int j = 0; j < strArray.Length; j++) { if (flag) { builder.Append(Holo.Encoding.encodeVL64(0)); } flag = true; i = client.getInt("SELECT icon FROM catalogue_categories WHERE indexname = '" + strArray[j] + "' LIMIT 1"); i = client.getInt("SELECT icon FROM catalogue_categories WHERE indexname = '" + strArray[j] + "' LIMIT 1"); num2 = client.getInt("SELECT colour FROM catalogue_categories WHERE indexname = '" + strArray[j] + "' LIMIT 1"); num3 = client.getInt("SELECT indexid FROM catalogue_categories WHERE indexname = '" + strArray[j] + "' LIMIT 1"); num4 = client.getInt("SELECT content FROM catalogue_categories WHERE indexname = '" + strArray[j] + "' LIMIT 1"); num6 = client.getInt(string.Concat(new object[] { "SELECT COUNT(indexid) FROM catalogue_pages WHERE incategory = '", num3, "' AND minrank <= '", userRank, "'" })); if (num5 != 0) { builder.Append(Holo.Encoding.encodeVL64(num5)); num5 = 0; } if (num4 == 0) { str3 = "M"; } else { str3 = Holo.Encoding.encodeVL64(num4); } if (num6 == 0) { builder.Append(string.Concat(new object[] { Holo.Encoding.encodeVL64(1), Holo.Encoding.encodeVL64(num2), Holo.Encoding.encodeVL64(i), str3, strArray[j], Convert.ToChar(2), Holo.Encoding.encodeVL64(0) })); } else { builder.Append(string.Concat(new object[] { "I", Holo.Encoding.encodeVL64(num2), Holo.Encoding.encodeVL64(i), str3, strArray[j], Convert.ToChar(2), "H", Holo.Encoding.encodeVL64(num6) })); } if (num6 != 0) { string[] strArray2 = dataHandling.dColToArray(client.getColumn(string.Concat(new object[] { "SELECT indexname FROM catalogue_pages WHERE incategory = '", num3, "' AND minrank <= '", userRank, "' ORDER BY indexid ASC" }))); for (int k = 0; k < strArray2.Length; k++) { if (strArray2[k] != "") { num7 = client.getInt("SELECT indexid FROM catalogue_pages WHERE indexname = '" + strArray2[k] + "' LIMIT 1"); str2 = client.getString("SELECT displayname FROM catalogue_pages WHERE indexname = '" + strArray2[k] + "' LIMIT 1"); int num10 = client.getInt("SELECT style_icon FROM catalogue_pages WHERE indexname = '" + strArray2[k] + "' LIMIT 1"); builder.Append("IH" + Holo.Encoding.encodeVL64(num10) + Holo.Encoding.encodeVL64(num7) + str2); } builder.Append(Convert.ToChar(2) + "HH"); } flag = false; } } return builder.ToString(); } } catch { str = Convert.ToChar(2).ToString(); } return str; } public static itemTemplate getTemplate(int templateID) { try { return (itemTemplate) itemCache[templateID]; } catch { return new itemTemplate(); } } public static void handlePurchase(int templateID, int receiverID, int roomID, string decorID, int presentBoxID, int teleportID1) { string sprite = getTemplate(templateID).Sprite; bool flag = true; switch (sprite) { case "landscape": case "wallpaper": case "floor": { int lastItemID = catalogueManager.lastItemID; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { client.runQuery(string.Concat(new object[] { "UPDATE furniture SET var = '", decorID, "' WHERE id = '", lastItemID, "' LIMIT 1" })); goto Label_055C; } } case "dimmer_buttn": case "dimmer_fuse2": case "dimmer_fuse6": case "dimmer_swtch": case "roomdimmer": { int num2 = catalogueManager.lastItemID; string str2 = "1,#000000,155"; string str3 = "0,1,1,#000000,155"; using (DatabaseClient client2 = Eucalypt.dbManager.GetClient()) { client2.runQuery(string.Concat(new object[] { "INSERT INTO furniture_moodlight(id,roomid,preset_cur,preset_1,preset_2,preset_3) VALUES ('", num2, "','0','1','", str2, "','", str2, "','", str2, "')" })); client2.runQuery(string.Concat(new object[] { "UPDATE furniture SET var = '", str3, "' WHERE id = '", num2, "' LIMIT 1" })); goto Label_055C; } } case "door": case "doorB": case "doorC": case "doorD": case "xmas08_telep": case "ads_cltele": case "ads_idol_tele": case "ads_mall_tele": case "lostc_teleport": case "ads_calip_tele": case "env_telep": case "sf_tele": case "ads_1800tele": case "teleport_door": { int num3 = teleportID1; using (DatabaseClient client3 = Eucalypt.dbManager.GetClient()) { client3.runQuery(string.Concat(new object[] { "INSERT INTO furniture(tid,ownerid,roomid,teleportid) VALUES ('", templateID, "','", receiverID, "','", roomID, "','", num3, "')" })); int num4 = catalogueManager.lastItemID; client3.runQuery(string.Concat(new object[] { "UPDATE furniture SET teleportid = '", num4, "' WHERE id = '", num3, "' LIMIT 1" })); if (presentBoxID > 0) { client3.runQuery(string.Concat(new object[] { "INSERT INTO furniture_presents(id,itemid) VALUES ('", presentBoxID, "','", num3, "')" })); client3.runQuery(string.Concat(new object[] { "INSERT INTO furniture_presents(id,itemid) VALUES ('", presentBoxID, "','", num4, "')" })); } } flag = false; goto Label_055C; } case "post.it": case "post.it.vd": { int num5 = catalogueManager.lastItemID; using (DatabaseClient client4 = Eucalypt.dbManager.GetClient()) { client4.runQuery("UPDATE furniture SET var = '20' WHERE id = '" + num5 + "' LIMIT 1"); goto Label_055C; } } default: if (stringManager.getStringPart(sprite, 0, 10) == "sound_set_") { int num6 = catalogueManager.lastItemID; int num7 = int.Parse(sprite.Substring(10)); using (DatabaseClient client5 = Eucalypt.dbManager.GetClient()) { client5.runQuery(string.Concat(new object[] { "UPDATE furniture SET soundmachine_soundset = '", num7, "' WHERE id = '", num6, "' LIMIT 1" })); } } goto Label_055C; } Label_055C: if ((presentBoxID > 0) && flag) { using (DatabaseClient client6 = Eucalypt.dbManager.GetClient()) { client6.runQuery(string.Concat(new object[] { "INSERT INTO furniture_presents(id,itemid) VALUES ('", presentBoxID, "','", catalogueManager.lastItemID, "')" })); } } } public static void Init(bool Update) { DataColumn column; Out.WriteLine("Starting caching of catalogue + items..."); using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { column = client.getColumn("SELECT indexid FROM catalogue_pages ORDER BY indexid"); } cataloguePages = new Hashtable(); itemCache = new Hashtable(); foreach (DataRow row in column.Table.Rows) { cachePage(Convert.ToInt32(row["indexid"])); } cachePage(Convert.ToInt32(-1)); Out.WriteLine(string.Concat(new object[] { "Successfully cached ", cataloguePages.Count, " catalogue pages and ", itemCache.Count, " item templates!" })); if (Update) { Thread.CurrentThread.Abort(); } } public static string tradeItemList(int[] itemIDs) { StringBuilder builder = new StringBuilder(); int i = 0; string str = ""; for (int j = 0; j < itemIDs.Length; j++) { if (!str.Contains("<" + itemIDs[j] + ">") && (itemIDs[j] != 0)) { DataRow row; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { row = client.getRow("SELECT tid, var FROM furniture WHERE id = '" + itemIDs[j] + "'"); } int num3 = 0; itemTemplate template = getTemplate(Convert.ToInt32(row["tid"])); using (DatabaseClient client2 = Eucalypt.dbManager.GetClient()) { num3 = client2.getInt("SELECT id FROM furniture_data WHERE sprite = '" + template.Sprite + "' LIMIT 1"); } int num4 = 0; if (template.Sprite == "poster") { num4 = int.Parse(template.Colour); } if ((template.Sprite == "post.it") || (template.Sprite == "post.it.vd")) { num4 = Convert.ToInt32(row["var"]); } if (template.typeID == 0) { builder.Append(string.Concat(new object[] { Holo.Encoding.encodeVL64(itemIDs[j]), "i\x0002", Holo.Encoding.encodeVL64(itemIDs[j]), Holo.Encoding.encodeVL64(num3), num4, "\x0002HHH" })); } else { builder.Append(Holo.Encoding.encodeVL64(itemIDs[j]) + "s\x0002" + Holo.Encoding.encodeVL64(itemIDs[j]) + Holo.Encoding.encodeVL64(num3) + "K\x0002RDPAYvGM"); } object obj2 = str; str = string.Concat(new object[] { obj2, "<", itemIDs[j], ">" }); i++; } } return (Holo.Encoding.encodeVL64(i) + builder.ToString()); } public static string wallPositionOK(string wallPosition) { try { string[] strArray = wallPosition.Split(new char[] { ' ' }); if ((strArray[2] != "l") && (strArray[2] != "r")) { return ""; } string[] strArray2 = strArray[0].Substring(3).Split(new char[] { ',' }); int num = int.Parse(strArray2[0]); int num2 = int.Parse(strArray2[1]); if (((num < 0) || (num2 < 0)) || ((num > 200) || (num2 > 200))) { return ""; } string[] strArray3 = strArray[1].Substring(2).Split(new char[] { ',' }); int num3 = int.Parse(strArray3[0]); int num4 = int.Parse(strArray3[1]); if (((num3 < 0) || (num4 < 0)) || ((num3 > 200) || (num4 > 200))) { return ""; } return string.Concat(new object[] { ":w=", num, ",", num2, " l=", num3, ",", num4, " ", strArray[2] }); } catch { return ""; } } public static int lastItemID { get { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { return client.getInt("SELECT MAX(id) FROM furniture"); } } } public static int lastNestID { get { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { return client.getInt("SELECT MAX(id) FROM pet_nests"); } } } public static int lastPetID { get { using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { return (client.getInt("SELECT MAX(id) FROM pets") + 1); } } } [StructLayout(LayoutKind.Sequential)] private struct cataloguePage { internal string displayName; internal string pageData; internal byte minRank; public string DisplayName { get { return this.displayName; } set { this.displayName = value; } } public string PageData { get { return this.pageData; } set { this.pageData = value; } } public byte MinRank { get { return this.minRank; } set { this.minRank = value; } } } [StructLayout(LayoutKind.Sequential)] public struct itemTemplate { internal byte typeID; internal string _Sprite; internal string _Colour; internal int _Length; internal int _Width; internal double topH; internal bool isDoor; internal bool isTradeable; internal bool isRecycleable; internal int maxStatus; internal int rightsRequired; internal int nexttoRequired; internal string drinkIDs; internal int indexID; public byte TypeID { get { return this.typeID; } set { this.typeID = value; } } public string Sprite { get { return this._Sprite; } set { this._Sprite = value; } } public string Colour { get { return this._Colour; } set { this._Colour = value; } } public int Length { get { return this._Length; } set { this._Length = value; } } public int Width { get { return this._Width; } set { this._Width = value; } } public double TopH { get { return this.topH; } set { this.topH = value; } } public bool IsDoor { get { return this.isDoor; } set { this.isDoor = value; } } public bool IsTradeable { get { return this.isTradeable; } set { this.isTradeable = value; } } public bool IsRecycleable { get { return this.isRecycleable; } set { this.isRecycleable = value; } } public int MaxStatus { get { return this.maxStatus; } set { this.maxStatus = value; } } public int RightsRequired { get { return this.rightsRequired; } set { this.rightsRequired = value; } } public int NexttoRequired { get { return this.nexttoRequired; } set { this.nexttoRequired = value; } } public string DrinkIDs { get { return this.drinkIDs; } set { this.drinkIDs = value; } } public int IndexID { get { return this.indexID; } set { this.indexID = value; } } public itemTemplate(bool b) { this.typeID = 1; this._Sprite = ""; this._Colour = "null"; this._Length = 1; this._Width = 1; this.topH = 0.0; this.isDoor = false; this.isTradeable = true; this.isRecycleable = false; this.maxStatus = 1; this.nexttoRequired = 0; this.rightsRequired = 1; this.indexID = 0; this.drinkIDs = ""; } public itemTemplate(string Sprite, byte typeID, string Colour, int Length, int Width, double topH, bool isDoor, bool isTradeable, bool isRecycleable, int maxStatus, int nexttoRequired, int rightsRequired, string drinkIDs, int dataID) { if (Sprite.Contains(" ")) { this._Sprite = Sprite.Split(new char[] { ' ' })[0]; this._Colour = Sprite.Split(new char[] { ' ' })[1]; } else { this._Sprite = Sprite; this._Colour = Colour; } this.typeID = typeID; this._Length = Length; this._Width = Width; this.topH = topH; this.isDoor = isDoor; this.isTradeable = isTradeable; this.isRecycleable = isRecycleable; this.maxStatus = maxStatus; this.nexttoRequired = nexttoRequired; this.rightsRequired = rightsRequired; this.drinkIDs = drinkIDs; this.indexID = dataID; } } } }