using System; using System.Collections.Generic; using System.Linq; using System.Text; using DuckEmulator.HabboHotel.Outside.Items; using DuckEmulator.HabboHotel.Outside.Messages.Types; using DuckEmulator.HabboHotel.Outside.Catalogue; using DuckEmulator.HabboHotel.Inside.Storage.MySql.Database.Interfaces; using DuckEmulator.HabboHotel.Outside.Rooms; using DuckEmulator.HabboHotel.Outside.Items.Triggers; using DuckEmulator.HabboHotel.Outside.Rooms.Movement; namespace DuckEmulator.HabboHotel.Outside.Furniture { class Furni { internal readonly uint Id; internal uint UserId; internal uint RoomId; internal uint BaseId; internal int X; internal int Y; internal int Rotation; internal string ExtraData = "0"; internal double Z = new double(); internal string WallPos = ""; internal Boolean IsFloorItem { get { return GetBaseItem().Type == "s"; } } internal Boolean IsWallItem { get { return GetBaseItem().Type == "i"; } } internal Boolean InRoom { get { if (RoomId == 0) return false; else if (GetRoom() != null) return true; return false; } } internal TriggerStruct Interactor { get { switch (GetBaseItem().InteractionType.ToLower()) { default: return new DefaultTrigger(); case "gate": return new GateTrigger(); } } } internal Coord SquareInFront { get { Coord Sq = new Coord(X, Y); if (Rotation == 0) { Sq.Y--; } else if (Rotation == 2) { Sq.X++; } else if (Rotation == 4) { Sq.Y++; } else if (Rotation == 6) { Sq.X--; } return Sq; } } internal Furni(uint Id, uint UserId, uint RoomId, uint BaseId, int X, int Y, int Rotation, double Z, string WallPos, string ExtraData) { this.Id = Id; this.UserId = UserId; this.RoomId = RoomId; this.BaseId = BaseId; this.Rotation = Rotation; this.X = X; this.Y = Y; this.Z = Z; this.WallPos = WallPos; this.ExtraData = ExtraData; } internal void Set(int X, int Y, double Z, int Rot) { this.X = X; this.Y = Y; this.Z = Z; this.Rotation = Rot; var newZ = Z.ToString().Replace(',', '.'); using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("UPDATE items SET x='" + X + "',y='" + Y + "',z='" + newZ + "', rot='" + Rot + "',room_id = '" + RoomId + "' WHERE id = '" + Id + "' LIMIT 1"); } } internal void SetRoom(uint ID) { this.RoomId = ID; using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("UPDATE items SET room_id = '" + RoomId + "' WHERE id = '" + Id + "' LIMIT 1"); } } internal void SetWall(string Pos, bool InDb) { this.WallPos = Pos; if (InDb) { using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("UPDATE items SET wall_pos = '" + WallPos + "' WHERE id = '" + Id + "' LIMIT 1"); } } } internal void UpdateOwner(uint NewOwner) { this.UserId = NewOwner; using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("UPDATE items SET user_id = '" + UserId + "' WHERE id = '" + Id + "' LIMIT 1"); } } internal void SerializeRoom(ServerMessage Message) { if (IsFloorItem) { Message.AppendUInt(Id); Message.AppendUInt(GetBaseItem().SpriteId); Message.AppendInt32(X); Message.AppendInt32(Y); Message.AppendInt32(Rotation); Message.AppendStringWithBreak(Z.ToString().Replace(',', '.')); Message.AppendBoolean(false); Message.AppendStringWithBreak(ExtraData); Message.AppendInt32(-1); } else if (IsWallItem) { Message.AppendStringWithBreak(Convert.ToString(Id)); Message.AppendUInt(GetBaseItem().SpriteId); Message.AppendStringWithBreak(WallPos); Message.AppendStringWithBreak((GetBaseItem().Type.ToLower() == "postit") ? ExtraData.Split(' ')[0] : ExtraData); } Message.AppendBoolean(false); } internal void SerializeInventory(ServerMessage Message) { Message.AppendUInt(Id); Message.AppendStringWithBreak(GetBaseItem().Type.ToUpper()); Message.AppendUInt(Id); Message.AppendUInt(GetBaseItem().SpriteId); if (GetBaseItem().SpriteName.Contains("a2")) { Message.AppendInt32(3); } else if (GetBaseItem().SpriteName.Contains("wallpaper")) { Message.AppendInt32(2); } else if (GetBaseItem().SpriteName.Contains("landscape")) { Message.AppendInt32(4); } else { Message.AppendInt32(0); } Message.AppendStringWithBreak(""); // extradata Message.AppendBoolean(false); // recycle Message.AppendBoolean(true); // cantrade Message.AppendBoolean(true); // canstack Message.AppendBoolean(false); // cansell Message.AppendInt32(-1); if (GetBaseItem().Type.ToLower() == "s") { Message.AppendStringWithBreak(""); Message.AppendInt32(-1); } } internal ServerMessage SerializeUpdates() { ServerMessage Message = new ServerMessage(); if (IsFloorItem) { Message.Init(88); Message.AppendStringWithBreak(Convert.ToString(Id)); Message.AppendStringWithBreak(ExtraData); } else { Message.Init(85); SerializeRoom(Message); } return Message; } internal void UpdateStatus() { if (!InRoom) return; using (IQueryAdapter Adapter = DuckEnvironment.GetAdapter()) { Adapter.runFastQuery("UPDATE items SET extra_data = '" + ExtraData + "' WHERE id = '" + Id + "' LIMIT 1"); } GetRoom().BroadcastResponse(SerializeUpdates()); } internal Item GetBaseItem() { return DuckEnvironment.ItemManager.GetItem(BaseId); } internal Room GetRoom() { return DuckEnvironment.RoomManager.GetRoom(RoomId); } } }