using System; using System.Data; using System.Linq; using System.Text; using System.Collections; using System.Threading; using System.Collections.Generic; using Chop.Database; namespace Chop.Game.Catalogue { public class CatalogueManager { public string FurnitureRevisions; private List Pages; private List Products; private List Deals; private List itemTemplates; public void Init() { CataloguePage root = new CataloguePage(); root._navigateable = true; root._icon = 0; root._color = 0; root._localization = ""; root.IndexID = -1; Pages = new List(); Products = new List(); Deals = new List(); itemTemplates = new List(); Pages.Add(root); using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) { foreach (DataRow row in dbClient.ReadDataTable("SELECT * FROM furniture_templates").Rows) try { itemTemplates.Add(ItemTemplate.Parse(row)); } catch { Console.WriteLine("Could not load furniture template {0} with the ID {1}.", row["sprite"], row["id"]); } foreach (DataRow row in dbClient.ReadDataTable("SELECT * FROM catalogue_products").Rows) try { Products.Add(CatalogueProduct.Parse(row)); } catch { Console.WriteLine("Could not load catalogue product {0} with the ID {1}.", row["name"], row["id"]); } foreach (DataRow row in dbClient.ReadDataTable("SELECT * FROM catalogue_deals").Rows) try { Deals.Add(CatalogOffer.Parse(row)); } catch { Console.WriteLine("Could not load catalogue page {0} with the ID {1}.", row["displayname"], row["indexid"]); } foreach (DataRow row in dbClient.ReadDataTable("SELECT * FROM catalogue_pages ORDER BY orderid ASC").Rows) try { //CataloguePage page = CataloguePage.Parse(row); Pages.Add(CataloguePage.Parse(row)); Console.WriteLine("Load catalogue page {0}.", row["displayname"]); //dbClient.AddParamWithValue("p1", page.IndexID); //dbClient.AddParamWithValue("p2", page.Label_Description); //dbClient.AddParamWithValue("p3", page.Label_Moredetails); //dbClient.AddParamWithValue("p4", page.Label_Misc); //dbClient.ExecuteQuery("INSERT INTO catalog_page_texts VALUES(@p1,1,@p2)"); //dbClient.ExecuteQuery("INSERT INTO catalog_page_texts VALUES(@p1,2,@p3)"); //dbClient.ExecuteQuery("INSERT INTO catalog_page_texts VALUES(@p1,3,@p4)"); } catch { Console.WriteLine("Could not load catalogue page {0}.", row["id"]); } } //GenerateFurnitureRevisions(); } public List GetProducts(int pageID) { return Products.Where(product => product.mPageID == pageID).ToList(); } public List GetDeals(int productID) { return Deals.Where(deal => deal._offerID == productID).ToList(); } public CatalogueProduct GetProduct(string sprite, int pageID) { return GetProducts(pageID).FirstOrDefault(product => GetItem(product.mTemplateID).Sprite == sprite); } public ItemTemplate GetItem(int ID) { return itemTemplates.FirstOrDefault(item => item.ID == ID); } public ItemTemplate GetItem(string sprite) { return itemTemplates.FirstOrDefault(item => item.Sprite == sprite); } public List GetPages() { return Pages; } public CataloguePage GetPage(int pageID) { return Pages.FirstOrDefault(page => page.IndexID == pageID); } public CataloguePage GetRootPage() { return Pages.FirstOrDefault(page => page.IndexID == -1); } public ItemTemplate GeneratePresent() { int r = new Random().Next(1, 7); return GetItem("present_gen" + r); } /// /// Handles special actions at purchase in the catalogue, such as decoration variables for items and items who are sold in pairs. /// /// The template ID of the item being purchased. /// The ID of the user that receives the item in his/her Hand. /// The target room ID of this item. 0 = inhand, -1 = in presentbox, -2 = in Recycler /// The wallpaper/floor value for wallpaper/floor purchases. /// If the item is bought as present, then specify the ID of the present box item. If not, specify 0. public void HandlePurchase(int templateID, int receiverID, int roomID, double decorID, int presentBoxID) { var template = GetItem(templateID); var handlePresentbox = true; if (template.Type == "") // using old method { #region Old //switch (template.Sprite.Split(' ')[0]) //{ // case "wallpaper": // case "floor": // case "landscape": // { // int itemID = LastItemID; // using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) // dbClient.ExecuteQuery("UPDATE furniture SET var = '" + decorID + "' WHERE id = '" + itemID + "' LIMIT 1"); // break; // } // case "roomdimmer": // { // int itemID = LastItemID; // string defaultPreset = "1,#000000,155"; // string defaultSetPreset = "1,1,1,#000000,155"; // using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) // { // dbClient.ExecuteQuery("INSERT INTO furniture_moodlight(id,roomid,preset_cur,preset_1,preset_2,preset_3) VALUES ('" + itemID + "','0','1','" + defaultPreset + "','" + defaultPreset + "','" + defaultPreset + "')"); // dbClient.ExecuteQuery("UPDATE furniture SET var = '" + defaultSetPreset + "' WHERE id = '" + itemID + "' LIMIT 1"); // } // break; // } // case "door": // case "doorB": // case "doorC": // case "doorD": // case "teleport_door": // { // int itemID1 = LastItemID; // using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) // { // dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,roomid,teleportid) VALUES ('" + templateID + "','" + receiverID + "','" + roomID + "','" + itemID1 + "')"); // int itemID2 = LastItemID; // dbClient.ExecuteQuery("UPDATE furniture SET teleportid = '" + itemID2 + "' WHERE id = '" + itemID1 + "' LIMIT 1"); // if (presentBoxID > 0) // { // dbClient.ExecuteQuery("INSERT INTO furniture_presents(id,itemid) VALUES ('" + presentBoxID + "','" + itemID1 + "')"); // dbClient.ExecuteQuery("INSERT INTO furniture_presents(id,itemid) VALUES ('" + presentBoxID + "','" + itemID2 + "')"); // } // } // handlePresentbox = false; // break; // } // case "post.it": // case "post.it.vd": // { // int itemID = LastItemID; // using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) // dbClient.ExecuteQuery("UPDATE furniture SET var = '20' WHERE id = '" + itemID + "' LIMIT 1"); // break; // } // default: // { // if (stringManager.getStringPart(template.Sprite, 0, 10) == "sound_set_") // { // int itemID = LastItemID; // int soundSet = int.Parse(template.Sprite.Substring(10)); // using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) // dbClient.ExecuteQuery("UPDATE furniture SET soundmachine_soundset = '" + soundSet + "' WHERE id = '" + itemID + "' LIMIT 1"); // } // else if (template.Sprite.Contains("wallpaper")) // { // int itemID = LastItemID; // using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) // dbClient.ExecuteQuery("UPDATE furniture SET var = '" + decorID + "' WHERE id = '" + itemID + "' LIMIT 1"); // } // break; // } //} #endregion } else { #region New switch (template.Type) { case "decoration": { int itemID = LastItemID; using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) dbClient.ExecuteQuery("UPDATE furniture SET var = '" + decorID + "' WHERE id = '" + itemID + "' LIMIT 1"); break; } case "dimmer": { int itemID = LastItemID; const string defaultPreset = "1,#000000,155"; const string defaultSetPreset = "1,1,1,#000000,155"; using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) { dbClient.ExecuteQuery("INSERT INTO furniture_moodlight(id,roomid,preset_cur,preset_1,preset_2,preset_3) VALUES ('" + itemID + "','0','1','" + defaultPreset + "','" + defaultPreset + "','" + defaultPreset + "')"); dbClient.ExecuteQuery("UPDATE furniture SET var = '" + defaultSetPreset + "' WHERE id = '" + itemID + "' LIMIT 1"); } break; } case "teleporter": { int itemID1 = LastItemID; using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) { dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,roomid,teleportid) VALUES ('" + templateID + "','" + receiverID + "','" + roomID + "','" + itemID1 + "')"); int itemID2 = LastItemID; dbClient.ExecuteQuery("UPDATE furniture SET teleportid = '" + itemID2 + "' WHERE id = '" + itemID1 + "' LIMIT 1"); if (presentBoxID > 0) { dbClient.ExecuteQuery("INSERT INTO furniture_presents(id,itemid) VALUES ('" + presentBoxID + "','" + itemID1 + "')"); dbClient.ExecuteQuery("INSERT INTO furniture_presents(id,itemid) VALUES ('" + presentBoxID + "','" + itemID2 + "')"); } } handlePresentbox = false; break; } case "stickie": { int itemID = LastItemID; using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) dbClient.ExecuteQuery("UPDATE furniture SET var = '20' WHERE id = '" + itemID + "' LIMIT 1"); break; } case "soundset": { int itemID = LastItemID; int soundSet = int.Parse(template.Sprite.Substring(10)); using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) dbClient.ExecuteQuery("UPDATE furniture SET soundmachine_soundset = '" + soundSet + "' WHERE id = '" + itemID + "' LIMIT 1"); break; } } #endregion } if (presentBoxID > 0 && handlePresentbox) { using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) dbClient.ExecuteQuery("INSERT INTO furniture_presents(id,itemid) VALUES ('" + presentBoxID + "','" + LastItemID + "')"); } } //public string TradeItemList(int[] itemIDs) //{ // var list = new ResponseBuilder(); // for (var i = 0; i < itemIDs.Length; i++) // { // if (itemIDs[i] == 0) // continue; // DataRow dRow; // using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) // { // dRow = dbClient.ReadDataRow("SELECT tid,var FROM furniture WHERE id = '" + itemIDs[i] + "'"); // } // var templateID = Convert.ToInt32(dRow["tid"]); // var template = GetItem(templateID); // list.AppendString("SI", 30); // list.AppendString(itemIDs[i], 30); // list.AppendString(i, 30); // if (template.TypeID > 0) // Flooritem // { // list.AppendString("S", 30); // list.AppendString(itemIDs[i], 30); // list.AppendString(template.Sprite, 30); // list.AppendString(template.Length, 30); // list.AppendString(template.Width, 30); // list.AppendString(dRow["var"], 30); // list.AppendString(template.Colour, 30); // list.AppendString(i, 30); // list.Append("/"); // } // else // { // string sprite = template.Sprite; // string colour = template.Colour; // if (template.posterString != null) // { // sprite = template.posterString[0]; // colour = template.posterString[1]; // } // list.AppendString("I", 30); // list.AppendString(itemIDs[i], 30); // list.AppendString(sprite, 30); // if (sprite == "post.it" || sprite == "post.it.vd") // list.AppendString(dRow["var"], 30); // else // list.AppendString(colour, 30); // list.AppendString(i, 30); // list.Append("/"); // } // } // return list.ToString(); //} /// /// Checks if the wallposition for a wallitem is correct, if it is, then the output should be exactly the same as the input. If not, then the wallposition is invalid. /// /// The original wallposition. [input] public string wallPositionOK(string wallPosition) { // TODO: Support different models? try { string[] posD = wallPosition.Split(' '); if (posD[2] != "l" && posD[2] != "r") return ""; string[] widD = posD[0].Substring(3).Split(','); int wallPartX = int.Parse(widD[0]); int wallPartY = int.Parse(widD[1]); if (wallPartX < 0 || wallPartY < 0 || wallPartX > 200 || wallPartY > 200) return ""; string[] lenD = posD[1].Substring(2).Split(','); int X = int.Parse(lenD[0]); int Y = int.Parse(lenD[1]); if (X < 0 || Y < 0 || X > 200 || Y > 200) return ""; return ":w=" + wallPartX + "," + wallPartY + " " + "l=" + X + "," + Y + " " + posD[2]; } catch { return ""; } } public int LastItemID { get { using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) { return dbClient.ReadInt32("SELECT MAX(id) FROM furniture"); } } } public void GenerateFurnitureRevisions() { FurnitureRevisions = "H"; return; /* Response fBuilder = new Response(); fBuilder.AppendInt32(itemTemplates.Count); foreach (ItemTemplate template in itemTemplates) { fBuilder.AppendString(template.Sprite); fBuilder.AppendInt32(template.Revision); } FurnitureRevisions = fBuilder.ToString(); */ } public void MakeItem(ItemTemplate pTemplate, uint pReceiverID, string pVar) { using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) { dbClient.AddParamWithValue("tid", pTemplate.ID); dbClient.AddParamWithValue("receiver", pReceiverID); dbClient.AddParamWithValue("var", pVar); //switch (pTemplate.Type) //{ // case "decoration": // { // int decorID = int.Parse(pVar); // dbClient.AddParamWithValue("decor", decorID); // dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,var) VALUES (@tid,@receiver,@decor)"); // break; // } // default: // { dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,var) VALUES (@tid,@receiver,@var)"); // break; // } //} } } public void MakePresent(uint pReceiverID, string pDescription) { ItemTemplate template = GeneratePresent(); using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) { dbClient.AddParamWithValue("tid", template.ID); dbClient.AddParamWithValue("receiver", pReceiverID); dbClient.AddParamWithValue("var", '!' + pDescription); dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,var) VALUES (@tid,@receiver,@var)"); } } internal List GetNodes(int _pageID) { List nodes = new List(); foreach (CataloguePage node in Pages) { if (node._parentID == _pageID) nodes.Add(node); } return nodes; } } }