namespace Holo.Managers { using Holo; using Ion.Storage; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Runtime.InteropServices; using System.Text; using System.Threading; public static class catalogueManager { private static Hashtable cataloguePages; private static Hashtable itemCache; private static void cachePage(int pageID) { DataRow row; DatabaseClient client; using (client = Eucalypt.dbManager.GetClient()) { row = client.getRow("SELECT indexname,minrank,displayname,style_layout,img_header,img_side,label_description,label_misc,label_moredetails FROM catalogue_pages WHERE indexid = '" + pageID + "' LIMIT 1"); } 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])); builder.Append(string.Concat(new object[] { "i:", key, Convert.ToChar(13), "n:", strArray[2], Convert.ToChar(13), "l:", strArray[3], Convert.ToChar(13) })); if (strArray[4] != "") { builder.Append("g:" + strArray[4] + Convert.ToChar(13)); } if (strArray[5] != "") { builder.Append("e:" + strArray[5] + Convert.ToChar(13)); } if (strArray[6] != "") { builder.Append("h:" + strArray[6] + Convert.ToChar(13)); } if (strArray[8] != "") { builder.Append("w:" + strArray[8] + Convert.ToChar(13)); } if (strArray[7] != "") { string[] strArray2 = strArray[7].Split(new char[] { Convert.ToChar(13) }); for (int j = 0; j < strArray2.Length; j++) { builder.Append(strArray2[j] + Convert.ToChar(13)); } } } using (client = Eucalypt.dbManager.GetClient()) { table = client.getTable("SELECT tid, typeid, length, width, catalogue_cost, door, tradeable, recycleable, catalogue_name, catalogue_description, name_cct, colour, top 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]; 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 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"]); numArray6[index] = Convert.ToInt32(row2["door"]); numArray7[index] = Convert.ToInt32(row2["tradeable"]); numArray8[index] = Convert.ToInt32(row2["recycleable"]); strArray3[index] = Convert.ToString(row2["catalogue_name"]); strArray4[index] = Convert.ToString(row2["catalogue_description"]); strArray5[index] = Convert.ToString(row2["name_cct"]); strArray6[index] = Convert.ToString(row2["colour"]); strArray7[index] = Convert.ToString(row2["top"]); index++; } for (index = 0; index < numArray.Length; index++) { if (stringManager.getStringPart(strArray5[index], 0, 4) != "deal") { itemCache.Add(numArray[index], new itemTemplate(strArray5[index], Convert.ToByte(numArray2[index]), strArray6[index], numArray3[index], numArray4[index], double.Parse(strArray7[index]), numArray6[index] == 1, numArray7[index] == 1, numArray8[index] == 1)); if (pageID != -1) { builder.Append(string.Concat(new object[] { "p:", strArray3[index], Convert.ToChar(9), strArray4[index], Convert.ToChar(9), numArray5[index], Convert.ToChar(9), Convert.ToChar(9) })); if (numArray2[index] == 0) { builder.Append("i"); } else { builder.Append("s"); } builder.Append(Convert.ToChar(9) + strArray5[index] + Convert.ToChar(9)); if (numArray2[index] == 0) { builder.Append(Convert.ToChar(9)); } else { builder.Append("0" + Convert.ToChar(9)); } if (numArray2[index] == 0) { builder.Append(Convert.ToChar(9)); } else { builder.Append(string.Concat(new object[] { numArray3[index], ",", numArray4[index], Convert.ToChar(9) })); } builder.Append(strArray5[index] + Convert.ToChar(9)); if (numArray2[index] > 0) { builder.Append(strArray6[index]); } builder.Append(Convert.ToChar(13)); } } else { int num5 = int.Parse(strArray5[index].Substring(4)); using (client = Eucalypt.dbManager.GetClient()) { table = client.getTable("SELECT tid, amount FROM catalogue_deals WHERE id = '" + num5 + "'"); } count = table.Rows.Count; int[] numArray9 = new int[count]; int[] numArray10 = new int[count]; int num6 = 0; foreach (DataRow row2 in table.Rows) { numArray9[num6] = Convert.ToInt32(row2["tid"]); numArray10[num6] = Convert.ToInt32(row2["amount"]); num6++; } builder.Append(string.Concat(new object[] { "p:", strArray3[index], Convert.ToChar(9), strArray4[index], Convert.ToChar(9), numArray5[index], Convert.ToChar(9), Convert.ToChar(9), "d" })); builder.Append(Convert.ToChar(9), 4); builder.Append(string.Concat(new object[] { "deal", num5, Convert.ToChar(9), Convert.ToChar(9), numArray9.Length, Convert.ToChar(9) })); for (int k = 0; k < numArray9.Length; k++) { using (client = Eucalypt.dbManager.GetClient()) { row = client.getRow("SELECT name_cct, colour FROM catalogue_items WHERE tid = '" + numArray9[k] + "' LIMIT 1"); } string str2 = Convert.ToString(row["name_cct"]); string str3 = Convert.ToString(row["colour"]); builder.Append(string.Concat(new object[] { str2, Convert.ToChar(9), numArray10[k], Convert.ToChar(9), str3, Convert.ToChar(9) })); } } } if (pageID != -1) { page.pageData = builder.ToString(); cataloguePages.Add(key, page); } } } public static string getPage(string pageName, byte userRank) { try { cataloguePage page = (cataloguePage) cataloguePages[pageName]; if (userRank < page.minRank) { return "holo.cast.catalogue.access_denied"; } return page.pageData; } catch { return "cast_catalogue.access_denied"; } } public static bool getPageExists(string pageName) { return cataloguePages.ContainsKey(cataloguePages.ContainsKey(pageName)); } public static string getPageIndex(byte userRank) { try { DataColumn column; StringBuilder builder = new StringBuilder(); using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { column = client.getColumn("SELECT indexname FROM catalogue_pages WHERE minrank <= '" + userRank + "' ORDER BY indexid ASC"); } string[] strArray = dataHandling.dColToArray(column); for (int i = 0; i < strArray.Length; i++) { if (cataloguePages.ContainsKey(strArray[i])) { builder.Append(string.Concat(new object[] { strArray[i], Convert.ToChar(9), ((cataloguePage) cataloguePages[strArray[i]]).displayName, Convert.ToChar(13) })); } } return builder.ToString(); } catch { return Convert.ToChar(13).ToString(); } } 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) { int lastItemID; DatabaseClient client; string sprite = getTemplate(templateID).Sprite; bool flag = true; switch (sprite) { case "landscape": case "wallpaper": case "floor": lastItemID = catalogueManager.lastItemID; using (client = Eucalypt.dbManager.GetClient()) { client.runQuery(string.Concat(new object[] { "UPDATE furniture SET var = '", decorID, "' WHERE id = '", lastItemID, "' LIMIT 1" })); } break; case "roomdimmer": { lastItemID = catalogueManager.lastItemID; string str2 = "1,#000000,155"; string str3 = "1,1,1,#000000,155"; using (client = Eucalypt.dbManager.GetClient()) { client.runQuery(string.Concat(new object[] { "INSERT INTO furniture_moodlight(id,roomid,preset_cur,preset_1,preset_2,preset_3) VALUES ('", lastItemID, "','0','1','", str2, "','", str2, "','", str2, "')" })); client.runQuery(string.Concat(new object[] { "UPDATE furniture SET var = '", str3, "' WHERE id = '", lastItemID, "' LIMIT 1" })); } break; } case "door": case "doorB": case "doorC": case "doorD": case "teleport_door": { int num2 = teleportID1; using (client = Eucalypt.dbManager.GetClient()) { client.runQuery(string.Concat(new object[] { "INSERT INTO furniture(tid,ownerid,roomid,teleportid) VALUES ('", templateID, "','", receiverID, "','", roomID, "','", num2, "')" })); int num3 = catalogueManager.lastItemID; client.runQuery(string.Concat(new object[] { "UPDATE furniture SET teleportid = '", num3, "' WHERE id = '", num2, "' LIMIT 1" })); if (presentBoxID > 0) { client.runQuery(string.Concat(new object[] { "INSERT INTO furniture_presents(id,itemid) VALUES ('", presentBoxID, "','", num2, "')" })); client.runQuery(string.Concat(new object[] { "INSERT INTO furniture_presents(id,itemid) VALUES ('", presentBoxID, "','", num3, "')" })); } } flag = false; break; } case "post.it": case "post.it.vd": lastItemID = catalogueManager.lastItemID; using (client = Eucalypt.dbManager.GetClient()) { client.runQuery("UPDATE furniture SET var = '20' WHERE id = '" + lastItemID + "' LIMIT 1"); } break; default: if (stringManager.getStringPart(sprite, 0, 10) == "sound_set_") { lastItemID = catalogueManager.lastItemID; int num4 = int.Parse(sprite.Substring(10)); using (client = Eucalypt.dbManager.GetClient()) { client.runQuery(string.Concat(new object[] { "UPDATE furniture SET soundmachine_soundset = '", num4, "' WHERE id = '", lastItemID, "' LIMIT 1" })); } } break; } if ((presentBoxID > 0) && flag) { using (client = Eucalypt.dbManager.GetClient()) { client.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(-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(List itemIDs) { StringBuilder builder = new StringBuilder(); foreach (int num in itemIDs) { DataRow row; using (DatabaseClient client = Eucalypt.dbManager.GetClient()) { row = client.getRow("SELECT tid, var FROM furniture WHERE id = '" + itemIDs[num] + "'"); } itemTemplate template = getTemplate(Convert.ToInt32(row["tid"])); builder.Append(string.Concat(new object[] { "SI", Convert.ToChar(30).ToString(), itemIDs[num], Convert.ToChar(30).ToString(), num, Convert.ToChar(30) })); if (template.typeID > 0) { builder.Append("S"); } else { builder.Append("I"); } builder.Append(string.Concat(new object[] { Convert.ToChar(30).ToString(), itemIDs[num], Convert.ToChar(30).ToString(), template.Sprite, Convert.ToChar(30) })); if (template.typeID > 0) { builder.Append(string.Concat(new object[] { template.Length, Convert.ToChar(30).ToString(), template.Width, Convert.ToChar(30).ToString(), Convert.ToString(row["var"]), Convert.ToChar(30).ToString() })); } builder.Append(string.Concat(new object[] { template.Colour, Convert.ToChar(30).ToString(), num, Convert.ToChar(30).ToString(), "/" })); } return 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"); } } } [StructLayout(LayoutKind.Sequential)] private struct cataloguePage { internal string displayName; internal string pageData; internal byte minRank; } [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; 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; } public itemTemplate(string Sprite, byte typeID, string Colour, int Length, int Width, double topH, bool isDoor, bool isTradeable, bool isRecycleable) { 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; } } } }