using System; using System.Data; using System.Threading; using System.Collections.Generic; using Woodpecker.Storage; using Woodpecker.Specialized.Text; using Woodpecker.Net.Game.Messages; using Woodpecker.Game.Items; using Woodpecker.Game.Items.Pets; using Woodpecker.Game.Rooms.Units; using Woodpecker.Game.Rooms.Pathfinding; namespace Woodpecker.Game.Rooms.Instances.Interaction { public partial class flatReactor : roomReactor { /// /// 67 - "AC" /// public void ADDSTRIPITEM() { if (Session.roomInstance.sessionHasFlatAdmin(Session.ID)) // Can pickup items { string[] removalData = Request.Content.Split(' '); int itemID = int.Parse(removalData[2]); stripItem returnItem = null; if (removalData[1] == "item") // Wall item returnItem = Session.roomInstance.pickupWallItem(itemID, Session.User.ID); else if (removalData[1] == "stuff") // Floor item returnItem = Session.roomInstance.pickupFloorItem(itemID, Session.User.ID); if (returnItem != null) // Successfully picked up to hand { Session.itemStripHandler.addHandItem(returnItem); Session.sendHandStrip("update"); } } } /// /// 90 - "AZ" /// public void PLACESTUFF() { if (Session.roomInstance.sessionHasRights(Session.ID)) { int itemID = int.Parse(Request.Content.Split(' ')[0]); stripItem pItem = Session.itemStripHandler.getHandItem(itemID); if (pItem == null) // Item not in hand return; bool Success = false; if (pItem.Definition.Behaviour.isWallItem) { if (pItem.Definition.Behaviour.isDecoration) // Can't place down decoration items (floor and wallpaper) return; string wallPosition = Request.Content.Substring(itemID.ToString().Length + 1); Engine.Game.Items.correctWallItemPosition(ref wallPosition); if (wallPosition == null) // Invalid wall position return; if (pItem.Definition.Behaviour.isPostIt) // Sticky pad { int padSize = int.Parse(pItem.customData) - 1; if (padSize <= 0) // Pad is empty now, remove and delete Session.itemStripHandler.removeHandItem(pItem.ID, true); else // Decrease pad size { pItem.customData = padSize.ToString(); Engine.Game.Items.setItemCustomData(pItem.ID, pItem.customData); } pItem = Engine.Game.Items.createItemInstance(pItem.Definition.ID, Session.roomInstance.Information.ownerID, "FFFF33"); } Success = Session.roomInstance.placeWallItem(pItem, wallPosition); } else { string[] locationData = Request.Content.Split(' '); byte X = byte.Parse(locationData[1]); byte Y = byte.Parse(locationData[2]); //byte Rotation = byte.Parse(locationData[3]); Success = Session.roomInstance.moveFloorItem(itemID, pItem, X, Y, 0); } if (Success && !pItem.Definition.Behaviour.isPostIt) Session.itemStripHandler.removeHandItem(itemID, false); } } } } namespace Woodpecker.Game.Rooms.Instances { public partial class roomInstance { #region Fields #endregion #region Methods /// /// Initializes all the item instances and adds them to the collections for items. /// private void loadItems() { if (this.floorItems != null) this.floorItems.Clear(); if (this.wallItems != null) this.wallItems.Clear(); if (this.roomPets != null) this.roomPets.Clear(); this.floorItems = new List(); if (this.Information.isUserFlat) { this.wallItems = new List(); this.roomPets = new List(); } Database dbClient = new Database(false, true); dbClient.addParameterWithValue("roomid", this.roomID); dbClient.Open(); if (!dbClient.Ready) return; // Too bad foreach (DataRow dRow in dbClient.getTable("SELECT * FROM items WHERE roomid = @roomid").Rows) { itemDefinition Definition = Engine.Game.Items.getItemDefinition((int)dRow["definitionid"]); if (Definition == null) // Invalid item continue; int itemID = (int)dRow["id"]; string customData = null; if (dRow["customdata"] != DBNull.Value) customData = (string)dRow["customdata"]; if (Definition.Behaviour.isWallItem) { wallItem pItem = new wallItem(); pItem.ID = itemID; pItem.Definition = Definition; pItem.roomID = this.roomID; pItem.ownerID = this.Information.ownerID; pItem.customData = customData; pItem.wallPosition = (string)dRow["wallposition"]; if (Definition.Behaviour.isPostIt) pItem.postItMessage = (string)dRow["postit_message"]; this.wallItems.Add(pItem); } else { floorItem pItem = new floorItem(); pItem.ID = itemID; pItem.Definition = Definition; pItem.roomID = this.roomID; pItem.ownerID = this.Information.ownerID; pItem.customData = customData; pItem.X = byte.Parse(dRow["x"].ToString()); pItem.Y = byte.Parse(dRow["y"].ToString()); pItem.Z = (float)dRow["z"]; pItem.Rotation = byte.Parse(dRow["rotation"].ToString()); if (pItem.Definition.Behaviour.isTeleporter) // Teleporter, initialize 'brother' ID pItem.teleporterID = (int)dRow["teleporterid"]; this.floorItems.Add(pItem); } } } /// /// Saves all the current positions of the items in this room. /// private void saveItems() { if (this.floorItems != null) { lock (this.floorItems) { foreach (floorItem lItem in this.floorItems) { if (lItem.requiresUpdate) { lItem.Update(); } } } } if (this.wallItems != null) { lock (this.wallItems) { foreach (wallItem lItem in this.wallItems) { if (lItem.requiresUpdate) { lItem.Update(); } } } } if (this.roomPets != null) { lock (this.roomPets) { foreach (roomPet lPet in this.roomPets) { lPet.Information.lastX = lPet.X; lPet.Information.lastY = lPet.Y; lPet.Information.Update(); // Update position of pet + current statistics } } } } /// /// Unloads all the item instances from the collections and nulls the collections. /// private void unloadItems() { if (this.floorItems != null) this.floorItems.Clear(); this.floorItems = null; if (this.wallItems != null) this.wallItems.Clear(); this.wallItems = null; if (this.roomPets != null) this.roomPets.Clear(); this.roomPets = null; } #endregion } }