using System; using System.Data; using System.Text; using Holo.Managers; using Ion.Storage; using Holo.Virtual.Item; using System.Collections.Generic; namespace Holo.Virtual.Users.Items { /// /// Represents the song editor of a virtual soundmachine, containing the active soundsets etc. /// class virtualSongEditor { private int machineID; private int[] Slot; private int[] SlotItemIDs; private bool[] SlotUpdated; private bool updated; Dictionary musicDiskIds; internal virtualSongEditor(int machineID) { this.machineID = machineID; this.Slot = new int[4]; this.SlotItemIDs = new int[4]; this.SlotUpdated = new bool[4]; updated = false; loadSoundsets(); } #region Soundset slot management /// /// Returns the string with all the soundsets in the Hand of a certain user. /// /// The database ID of the user to get the soundsets of. public string getHandSoundsets(List handItem) { musicDiskIds = new Dictionary(); foreach (genericItem item in handItem) { if (item.template.isMusicDisk) { if(!hasSoundSet(item.template.musicDiskNumber) && !musicDiskIds.ContainsKey(item.template.musicDiskNumber)) { musicDiskIds.Add(item.template.musicDiskNumber, item.ID); } } } StringBuilder Soundsets = new StringBuilder(Encoding.encodeVL64(musicDiskIds.Count)); foreach (int i in musicDiskIds.Keys) Soundsets.Append(Encoding.encodeVL64(i)); return Soundsets.ToString(); } private bool hasSoundSet(int soundSetNumber) { for (int i = 0; i < Slot.Length; i++) { if (Slot[i] == soundSetNumber) return true; } return false; } internal void loadSoundsets() { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT soundset_1, soundset_2, soundset_3, soundset_4 FROM soundmachine WHERE id = " + machineID); } string[] information; for(int i = 0; i < 4; i++) { information = dRow[i].ToString().Split(" ".ToCharArray()); Slot[i] = int.Parse(information[0]); SlotItemIDs[i] = int.Parse(information[1]); SlotUpdated[i] = false; } } internal int addSoundset(int soundsetNumber, byte slotID) { if (musicDiskIds.ContainsKey(soundsetNumber)) { Slot[slotID - 1] = soundsetNumber; SlotItemIDs[slotID - 1] = this.musicDiskIds[soundsetNumber]; SlotUpdated[slotID - 1] = true; updated = true; return musicDiskIds[soundsetNumber]; } return 0; } internal genericItem removeSoundset(int slotID) { Slot[slotID - 1] = 0; if (SlotItemIDs[slotID - 1] > 0) { genericItem item = new genericItem(this.SlotItemIDs[slotID - 1]); SlotUpdated[slotID - 1] = true; SlotItemIDs[slotID - 1] = 0; updated = true; return item; } else return null; } internal bool slotFree(int slotID) { return (Slot[slotID - 1] == 0); } internal string getSoundsets() { int Amount = 0; StringBuilder Soundsets = new StringBuilder(); for (int slotID = 0; slotID < 4; slotID++) { int Soundset = Slot[slotID]; if (Soundset > 0) { Soundsets.Append(Encoding.encodeVL64(slotID + 1) + Encoding.encodeVL64(Soundset) + "QB"); // QB = 9, samples per set int v = (Soundset * 9) - 8; for (int j = v; j <= v + 8; j++) Soundsets.Append(Encoding.encodeVL64(j)); Amount++; } } return "PA" + Encoding.encodeVL64(Amount) + Soundsets.ToString(); } public void destroy() { saveDisks(); } #endregion internal void saveDisks() { if (updated) { StringBuilder sb = new StringBuilder("UPDATE soundmachine set "); for (int i = 0; i < 4; i++) { if (SlotUpdated[i]) { sb.Append(" soundset_" + (i + 1) + " = '" + Slot[i] + " " + SlotItemIDs[i] + "' ,"); } } sb.Remove(sb.Length - 1, 1); sb.Append(" WHERE id = " + machineID); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery(sb.ToString()); } } } } }