using System; using System.Collections.Generic; using System.Linq; using System.Text; using DuckEmulator.HabboHotel.Outside.Furniture; using DuckEmulator.HabboHotel.Outside.Messages.Types; namespace DuckEmulator.HabboHotel.Outside.Rooms { class UserRoller { internal RoomUser User; internal Furni Roller; private ushort FrontX { get { return (ushort)Roller.SquareInFront.X; } } private ushort FrontY { get { return (ushort)Roller.SquareInFront.Y; } } private double FrontZ { get { return (User.GetRoom() != null) ? User.GetRoom().GetAffectedHeight(FrontX, FrontY) : 0.0; } } internal UserRoller(RoomUser User, Furni Roller) { this.User = User; this.Roller = Roller; } internal void Broadcast() { if (GetRoom() == null || Roller == null || User == null) { Dispose(); return; } if (!GetRoom().CanWalk(FrontX, FrontY, true) || User.IsWalking) { Dispose(); return; } ServerMessage Message = new ServerMessage(230); Message.AppendInt32(User.X); Message.AppendInt32(User.Y); Message.AppendInt32(FrontX); Message.AppendInt32(FrontY); Message.AppendBoolean(false); // Is not an Furni Message.AppendUInt(Roller.Id); Message.AppendInt32(2); Message.AppendUInt(User.VirtualId); Message.AppendStringWithBreak(User.Z.ToString().Replace(',', '.')); Message.AppendStringWithBreak(FrontZ.ToString().Replace(',', '.')); // Send Message -> Client [Do action] if (GetRoom() != null && !User.IsWalking) { GetRoom().BroadcastResponse(Message); Dispose(); } // Update in Environment <- [Internal - Save] if (User != null && !User.IsWalking) { User.SetX = FrontX; User.SetY = FrontY; User.SetZ = FrontZ; User.SetTile(); User.UpdateOnTile(); } } internal void Dispose() { GetRoom().UserRollers.Remove(this); } internal Room GetRoom() { if (User.GetRoom() != null) { return User.GetRoom(); } else if (Roller.GetRoom() != null) { return Roller.GetRoom(); } return null; } } sealed class FurniRoller { internal Furni Roller; internal Furni Furni; private ushort FrontX { get { return (ushort)Roller.SquareInFront.X; } } private ushort FrontY { get { return (ushort)Roller.SquareInFront.Y; } } private double FrontZ { get { return Furni.GetRoom().GetAffectedHeight(FrontX, FrontY); } } internal FurniRoller(Furni Furni, Furni Roller) { this.Furni = Furni; this.Roller = Roller; } internal void Broadcast() { if (Roller == null || Furni == null) { Dispose(); return; } ushort FrontX = (ushort)Roller.SquareInFront.X; ushort FrontY = (ushort)Roller.SquareInFront.Y; double FrontZ = Roller.GetRoom().GetAffectedHeight(FrontX, FrontY); if (!GetRoom().CanWalk(FrontX, FrontY, true)) { Dispose(); return; } if (Roller.GetRoom().Matrix[FrontX, FrontY] == false || Roller.GetRoom().UsersOnTile(FrontX, FrontY)) { Dispose(); return; } ServerMessage Message = new ServerMessage(230); Message.AppendInt32(Furni.X); Message.AppendInt32(Furni.Y); Message.AppendInt32(FrontX); Message.AppendInt32(FrontY); Message.AppendBoolean(true); // Is an Furni Message.AppendUInt(Furni.Id); Message.AppendStringWithBreak(Furni.Z.ToString().Replace(',', '.')); Message.AppendStringWithBreak(FrontZ.ToString().Replace(',', '.')); Message.AppendUInt(Roller.Id); if (Roller.GetRoom() != null) { Roller.GetRoom().BroadcastResponse(Message); Dispose(); } if (Furni != null) { GetRoom().SetFloorItem(Furni, FrontX, FrontY, Furni.Rotation, false); } } internal void Dispose() { GetRoom().FurniRollers.Remove(this); } internal Room GetRoom() { if (Furni.GetRoom() != null) { return Furni.GetRoom(); } else if (Roller.GetRoom() != null) { return Roller.GetRoom(); } return null; } } }