/* Thor Server Project Copyright 2008 Joe Hegarty This file is part of The Thor Server Project. The Thor Server Project is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The Thor Server Project is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with The Thor Server Project. If not, see . */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using ThorServer.Data; namespace ThorServer.Game.Furni { public class FurniManager { public List GetRoomFloorFurni(int roomId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomId); DataTable dt = db.GetDataSet("SELECT * FROM Furni JOIN FurniDefinitions ON Furni.FurniTypeID = FurniDefinitions.FurniDefinitionID WHERE RoomID = @roomid;").Tables[0]; db.sqlexecute.Parameters.Clear(); List results = new List(); foreach (DataRow dRow in dt.Rows) { FurniInfo info = ProcessDataRow(dRow); if (!info.Flags.WallItem) { results.Add(info); } } return results; } public List GetRoomWallFurni(int roomId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@roomid", roomId); DataTable dt = db.GetDataSet("SELECT * FROM Furni JOIN FurniDefinitions ON Furni.FurniTypeID = FurniDefinitions.FurniDefinitionID WHERE RoomID = @roomid").Tables[0]; db.sqlexecute.Parameters.Clear(); List results = new List(); foreach (DataRow dRow in dt.Rows) { FurniInfo info = ProcessDataRow(dRow); if (info.Flags.WallItem) { results.Add(info); } } return results; } public List GetHandFurniList(int ownerId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@ownerid", ownerId); DataTable dt = db.GetDataSet("SELECT * FROM Furni JOIN FurniDefinitions ON Furni.FurniTypeID = FurniDefinitions.FurniDefinitionID WHERE OwnerID = @ownerid AND RoomID = 0;").Tables[0]; db.sqlexecute.Parameters.Clear(); List results = new List(); foreach (DataRow dRow in dt.Rows) { results.Add(ProcessDataRow(dRow)); } return results; } public FurniInfo GetFurni(int furniId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furniId); DataRow dRow = db.GetDataSet("SELECT * FROM Furni JOIN FurniDefinitions ON Furni.FurniTypeID = FurniDefinitions.FurniDefinitionID WHERE FurniID = @furniid;").Tables[0].Rows[0]; db.sqlexecute.Parameters.Clear(); return ProcessDataRow(dRow); } public bool FurniExists(int furniId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furniId); int res = db.getInt("SELECT COUNT(*) FROM Furni WHERE FurniID = @furniid;"); db.sqlexecute.Parameters.Clear(); return res > 0; } public int GetStickyType(string colour) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@colour", colour); int res = db.getInt("SELECT COUNT(*) FROM FurniDefinitions WHERE Col = @colour AND Flags LIKE '%N%';"); if (res > 0) { res = db.getInt("SELECT FurniDefinitionID FROM FurniDefinitions WHERE Col = @colour AND Flags LIKE '%N%';"); } db.sqlexecute.Parameters.Clear(); return res; } public int GetTypeFromSprite(string sprite) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@sprite", sprite); int res = db.getInt("SELECT COUNT(*) FROM FurniDefinitions WHERE Sprite = @sprite;"); if (res > 0) { res = db.getInt("SELECT FurniDefinitionID FROM FurniDefinitions WHERE Sprite = @sprite;"); } db.sqlexecute.Parameters.Clear(); return res; } public void MoveFloorItem(int furniID, int newX, int newY, float newZ, int newRot, Rooms.RoomInfo rInfo) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furniID); db.sqlexecute.Parameters.AddWithValue("@newx", newX); db.sqlexecute.Parameters.AddWithValue("@newy", newY); db.sqlexecute.Parameters.AddWithValue("@newz", newZ); db.sqlexecute.Parameters.AddWithValue("@newrot", newRot); db.sqlexecute.Parameters.AddWithValue("@roomid", rInfo.RoomID); db.sqlexecute.Parameters.AddWithValue("@owner", rInfo.RoomOwner); db.ExecuteSQL("UPDATE Furni SET PosX = @newx, PosY = @newy, PosZ = @newz, PosRotation = @newrot, RoomID = @roomid, OwnerID = @owner WHERE FurniID = @furniid;"); db.sqlexecute.Parameters.Clear(); } public int CreateNewFurni(int furniTypeID, int userId) { Database db = new Database(); SqlParameter identity = new SqlParameter("@identity", SqlDbType.Int); identity.Value = 0; identity.Direction = ParameterDirection.Output; db.sqlexecute.Parameters.Add(identity); db.sqlexecute.Parameters.AddWithValue("@furnitype", furniTypeID); db.sqlexecute.Parameters.AddWithValue("@owner", userId); db.ExecuteSQL("INSERT INTO Furni (FurniTypeID, OwnerID) VALUES (@furnitype, @owner); SET @identity = @@identity;"); db.sqlexecute.Parameters.Clear(); return (int)identity.Value; } public void SetStuffDataFloorItem(int furniID, string stuffdata) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furniID); db.sqlexecute.Parameters.AddWithValue("@stuff", stuffdata); db.ExecuteSQL("UPDATE Furni SET FurniVar = @stuff WHERE FurniID = @furniid;"); db.sqlexecute.Parameters.Clear(); } public void SetTeleportID(int furniID, int teleId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furniID); db.sqlexecute.Parameters.AddWithValue("@tele", teleId); db.ExecuteSQL("UPDATE Furni SET TeleportID = @tele WHERE FurniID = @furniid;"); db.sqlexecute.Parameters.Clear(); } public void SetItemType(int furniID, int itemType) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furniID); db.sqlexecute.Parameters.AddWithValue("@type", itemType); db.ExecuteSQL("UPDATE Furni SET FurniTypeID = @type WHERE FurniID = @furniid;"); db.sqlexecute.Parameters.Clear(); } public void DeleteFurni(int furniID) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furniID); db.ExecuteSQL("DELETE FROM Furni WHERE FurniID = @furniid;"); db.sqlexecute.Parameters.Clear(); } public void MoveWallItem(int furnID, string newPos, int roomid, int owner) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furnID); db.sqlexecute.Parameters.AddWithValue("@newpos", newPos); db.sqlexecute.Parameters.AddWithValue("@roomid", roomid); db.sqlexecute.Parameters.AddWithValue("@owner", owner); db.ExecuteSQL("UPDATE Furni SET WallLocation = @newpos, RoomID = @roomid, OwnerID = @owner WHERE FurniID = @furniid;"); db.sqlexecute.Parameters.Clear(); } public void PickupItem(int furnID, int userId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@furniid", furnID); db.sqlexecute.Parameters.AddWithValue("@ownerid", userId); db.ExecuteSQL("UPDATE Furni SET OwnerID = @ownerid, PosX = 0, PosY = 0, PosZ = 0, PosRotation = 0, RoomID = 0, WallLocation = '' WHERE FurniID = @furniid;"); db.sqlexecute.Parameters.Clear(); } private FurniInfo ProcessDataRow(DataRow dRow) { FurniInfo info = new FurniInfo(); info.FurniID = int.Parse(dRow["FurniID"].ToString()); info.RoomID = int.Parse(dRow["RoomID"].ToString()); info.FurniDefinitionID= int.Parse(dRow["FurniDefinitionID"].ToString()); info.PosX = int.Parse(dRow["PosX"].ToString()); info.PosY = int.Parse(dRow["PosY"].ToString()); info.PosZ = float.Parse(dRow["PosZ"].ToString()); info.W = int.Parse(dRow["W"].ToString()); info.L = int.Parse(dRow["L"].ToString()); info.Col = dRow["Col"].ToString(); info.PosRotation = int.Parse(dRow["PosRotation"].ToString()); info.OwnerID = int.Parse(dRow["OwnerID"].ToString()); info.FurniSprite = dRow["Sprite"].ToString(); info.FurniFlags = dRow["Flags"].ToString(); info.FurniVar = dRow["FurniVar"].ToString(); info.HeightOffset = float.Parse(dRow["HeightOffset"].ToString()); info.HandType = dRow["HandType"].ToString(); info.WallLocation = dRow["WallLocation"].ToString(); info.VarType = (FurniInfo.VarTypes) int.Parse(dRow["VarType"].ToString()); info.FurniName = GetItemName(info.Flags.WallItem, info.FurniSprite, info.Col); info.FurniDesc = GetItemDesc(info.Flags.WallItem, info.FurniSprite, info.Col); info.TeleportId = (int)dRow["TeleportId"]; info.FurniTypeId = (int)dRow["FurniTypeID"]; info.ActionHeight = float.Parse(dRow["ActionHeight"].ToString()); info.CanTrade = (bool)dRow["CanTrade"]; info.PublicFurni = (bool)dRow["PublicFurni"]; info.ProcessFlags(); return info; } public int GetRandomPresentDefinition() { Database db = new Database(); return db.getInt("SELECT TOP 1 FurniDefinitionID FROM FurniDefinitions WHERE Flags LIKE '%G%' ORDER BY NEWID();"); } public void AddGift(GiftInfo info) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@giftid", info.GiftId); db.sqlexecute.Parameters.AddWithValue("@purchasecode", info.PurchaseCode); db.sqlexecute.Parameters.AddWithValue("@payload", info.Payload); db.ExecuteSQL("INSERT INTO Gifts (GiftID, PurchaseCode, Payload) VALUES (@giftid, @purchasecode, @payload);"); db.sqlexecute.Parameters.Clear(); } public GiftInfo GetGift(int giftId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@giftid", giftId); DataRow dRow = db.GetDataSet("SELECT * FROM Gifts Where GiftID = @giftid;").Tables[0].Rows[0]; db.sqlexecute.Parameters.Clear(); GiftInfo info = new GiftInfo(); info.GiftId = (int)dRow["GiftID"]; info.Payload = dRow["Payload"].ToString(); info.PurchaseCode = dRow["PurchaseCode"].ToString(); return info; } public void DeleteGift(int giftId) { Database db = new Database(); db.sqlexecute.Parameters.AddWithValue("@giftid", giftId); db.ExecuteSQL("DELETE FROM Gifts Where GiftID = @giftid;"); db.sqlexecute.Parameters.Clear(); } public string GetItemName(bool wallItem, string sprite, string extra) { if (wallItem) { if (sprite == "poster") { return InstanceManager.Game.Externals.GetTextValue("poster_" + extra + "_name"); } else { return InstanceManager.Game.Externals.GetTextValue("wallitem_" + sprite + "_name"); } } else { return InstanceManager.Game.Externals.GetTextValue("furni_" + sprite + "_name"); } } public string GetItemDesc(bool wallItem, string sprite, string extra) { if (wallItem) { if (sprite == "poster") { return InstanceManager.Game.Externals.GetTextValue("poster_" + extra + "_desc"); } else { return InstanceManager.Game.Externals.GetTextValue("wallitem_" + sprite + "_desc"); } } else { return InstanceManager.Game.Externals.GetTextValue("furni_" + sprite + "_desc"); } } } }