using System; using System.Data; 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() { Pages = new List(); Products = new List(); Deals = new List(); itemTemplates = new List(); using (DatabaseClient dbClient = Core.DatabaseManager.GetClient()) { foreach (DataRow row in dbClient.ReadDataTable("SELECT * FROM furniture_templates").Rows) itemTemplates.Add(ItemTemplate.Parse(row)); foreach (DataRow row in dbClient.ReadDataTable("SELECT * FROM catalogue_products").Rows) Products.Add(CatalogueProduct.Parse(row)); foreach (DataRow row in dbClient.ReadDataTable("SELECT * FROM catalogue_deals").Rows) Deals.Add(CatalogueDeal.Parse(row)); foreach (DataRow row in dbClient.ReadDataTable("SELECT * FROM catalogue_pages ORDER BY orderid ASC").Rows) Pages.Add(CataloguePage.Parse(row)); } GenerateFurnitureRevisions(); } public List getProducts(int pageID) { List products = new List(); foreach (CatalogueProduct product in Products) if (product.mPageID == pageID) products.Add(product); return products; } public List getDeals(int productID) { List deals = new List(); foreach (CatalogueDeal deal in Deals) if (deal.mProductID == productID) deals.Add(deal); return deals; } public CatalogueProduct getProduct(string sprite, int pageID) { foreach (CatalogueProduct product in getProducts(pageID)) if (getItem(product.mTemplateID).Sprite == sprite) return product; return null; } public ItemTemplate getItem(int ID) { foreach (ItemTemplate item in itemTemplates) if (item.ID == ID) return item; return null; } public ItemTemplate getItem(string sprite) { foreach (ItemTemplate item in itemTemplates) if (item.Sprite == sprite) return item; return null; } public List getPages() { return Pages; } public CataloguePage getPage(string indexname) { foreach (CataloguePage page in Pages) if (page.IndexName == indexname) return page; return null; } 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) { ItemTemplate template = getItem(templateID); bool 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; 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 "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) { Response List = new Response(); for (int 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] + "'"); } int templateID = Convert.ToInt32(dRow["tid"]); ItemTemplate 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.AppendWired(itemTemplates.Count); foreach (ItemTemplate template in itemTemplates) { fBuilder.AppendString(template.Sprite); fBuilder.AppendWired(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)"); } } } }