using System.Collections.Generic; using Holo.Virtual.Item; using System.Data; using System; using System.Text; namespace Holo.Source.Virtual.Users.ItemManagement { class HandItemManager { /// /// The user this handitem manager belongs to /// private int userID; /// /// The list of items, with the ID as key field /// private Dictionary Items; private List itemIDsAdded; private List itemIDsRemoved; private List itemIDsStart; /// /// The list of handitems, can be approached as an array /// private List handItems; /// /// Generates the users new list of items /// /// The items in Datatable format public HandItemManager(DataTable Items, int userID) { this.Items = new Dictionary(); handItems = new List(); itemIDsAdded = new List(); itemIDsRemoved = new List(); itemIDsStart = new List(); this.userID = userID; makeItemList(Items); } /// /// Generates the list of items /// /// the item list in DataTable format public void makeItemList(DataTable itemTable) { genericItem toAdd; string Var; int templateID; int itemID; string wallPos; foreach (DataRow dRow in itemTable.Rows) { Var = dRow["var"].ToString(); templateID = Convert.ToInt32(dRow["tid"]); itemID = Convert.ToInt32(dRow["id"]); wallPos = dRow["wallpos"].ToString(); toAdd = new genericItem(itemID, templateID, Var, wallPos); Items.Add(itemID, toAdd); handItems.Add(toAdd); itemIDsStart.Add(itemID); } } /// /// returns the item /// /// /// public genericItem getItem(int itemID) { if (Items.ContainsKey(itemID)) return Items[itemID]; else return null; } /// /// Looks if a user has an item or not /// /// the ID of the item /// True if it has an item, False if it doesn't public bool hasItem(int itemID) { return Items.ContainsKey(itemID); } /// /// Adds a list of items /// /// The list which should be added public void addItemList(List toAdd) { foreach (genericItem toadd in toAdd) { addItem(toadd); } } /// /// Adds an item to the list of items to delete from the database. /// /// The item which is beeing deleted private void deleteDatabaseEntry(genericItem item) { if (itemIDsAdded.Contains(item.ID)) itemIDsAdded.Remove(item.ID); if (itemIDsRemoved.Contains(item.ID)) return; itemIDsRemoved.Add(item.ID); } /// /// Adds an item to the list of "inserts" for the database /// /// The item which is beeing added private void addDatabaseEntry(genericItem item) { if (itemIDsRemoved.Contains(item.ID)) itemIDsRemoved.Remove(item.ID); if (itemIDsStart.Contains(item.ID)) return; if (itemIDsAdded.Contains(item.ID)) return; itemIDsAdded.Add(item.ID); } /// /// Clears all items in this hand item manager /// public void clearItems(bool purge) { if (purge) { foreach (genericItem item in Items.Values) { deleteDatabaseEntry(item); } } Items.Clear(); handItems.Clear(); } /// /// adds an item to the collection /// /// The item to add public void addItem(genericItem item) { if (!Items.ContainsKey(item.ID)) { Items.Add(item.ID, item); handItems.Add(item); addDatabaseEntry(item); } } /// /// Updates an given item /// /// The item that needed the update public void updateItem(genericItem item) { if (Items.ContainsKey(item.ID)) { removeItem(item.ID); } addItem(item); } /// /// removes an item in the item manager /// /// The id of the item /// The item that was removed public genericItem removeItem(int itemID) { if (Items.ContainsKey(itemID)) { genericItem backupItem = Items[itemID]; Items.Remove(itemID); deleteDatabaseEntry(backupItem); if (handItems.Contains(backupItem)) handItems.Remove(backupItem); return backupItem; } else { return null; } } /// /// Gets a handitem at the desired location /// /// The location of the item /// A Handitem public genericItem getHandItem(int location) { if (location < handItems.Count) { return handItems[location]; } return null; } /// /// Returns the length of the list of items /// /// The amount of items public int handLength() { return handItems.Count; } /// /// Destroys this instance. /// internal void destroy() { clearItems(false); handItems = null; Items = null; doDatabaseUpdate(false); } internal void update() { doDatabaseUpdate(true); } /// /// Does an database update /// internal void doDatabaseUpdate(bool update) { lock (this) { if (itemIDsAdded.Count > 0 || itemIDsRemoved.Count > 0) { StringBuilder sb = new StringBuilder(); if (itemIDsAdded.Count > 0) { sb.Append("INSERT INTO user_furniture (user_id,furniture_id) VALUES "); foreach (int id in itemIDsAdded) { sb.Append("('" + userID + "','" + id + "'), "); } sb.Remove(sb.Length - 2, 2); sb.Append(";\r\n"); } if (itemIDsRemoved.Count > 0) { sb.Append("DELETE FROM user_furniture WHERE "); foreach (int id in itemIDsRemoved) { sb.Append("(user_id = '" + userID + "' AND furniture_id = '" + id + "') OR "); } sb.Remove(sb.Length - 3, 3); } using (Ion.Storage.DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery(sb.ToString()); } if (update) { foreach (int i in itemIDsAdded) { itemIDsStart.Add(i); } foreach (int i in itemIDsRemoved) { itemIDsStart.Remove(i); } } itemIDsAdded.Clear(); itemIDsRemoved.Clear(); } } } /// /// Returns all items of this instance /// /// internal List getAllItems() { return handItems; } } }