using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using Holo.Managers; using Holo.Virtual.Rooms; using Holo.Virtual.Users.Items; using Holo.Virtual.Users.Messenger; using Ion.Storage; using System.Data; using Holo.Source; using Holo.Source.Virtual.Catalogue; using System.Collections.Generic; using Holo.Source.Virtual.Soundmachine; using Holo.Source.Virtual.Staff; using Holo.Source.Virtual.Users; using System.Collections; namespace Holo.Virtual.Users { /// /// Represents a virtual user, with connection and packet handling, access management etc etc. The details about the user are kept separate in a different class. /// public class virtualUser { #region Declares /// /// The ID of the connection for this virtual user. Assigned by the game socket server. /// private int connectionID; /// /// The socket that connects the client with the emulator. Operates asynchronous. /// private Socket connectionSocket; /// /// The byte array where the data is saved in while receiving the data asynchronously. /// private byte[] dataBuffer = new byte[1024]; /// /// Specifies if the client has sent the 'CD' packet on time. Being checked by the user manager every minute. /// internal bool pingOK; /// /// Specifies if the client is disconnected already. /// private bool _isDisconnected; /// /// Specifies if the client has logged in and the user details are loaded. If false, then the user is just a connected client and shouldn't be able to send 'logged in' packets. /// private bool _isLoggedIn; /// /// Specifies if the user has received the sprite index packet (Dg) already. This packet only requires being sent once, and since it's a BIG packet, we limit it to send it once. /// private bool _receivedSpriteIndex; /// /// The number of the page of the Hand (item inventory) the user is currently on. /// private int _handPage; private delegate void timedDisconnector(int ms); /// /// The virtual room the user is in. /// internal virtualRoom Room; /// /// The virtualRoomUser that represents this virtual user in room. Contains in-room only objects such as position, rotation and walk related objects. /// internal virtualRoomUser roomUser; /// /// The status manager that keeps status strings for the user in room. /// internal virtualRoomUserStatusManager statusManager; /// /// The messenger that provides instant messaging, friendlist etc for this virtual user. /// internal Messenger.virtualMessenger Messenger; internal FuseBuilder Response; #endregion #region Personal internal int userID; internal string _Username; internal string _Figure; internal char _Sex; internal string _Mission; internal byte _Rank; internal int _Credits; internal int _Tickets; internal bool _clubMember; internal int _roomID; internal bool _inPublicroom; internal bool _ROOMACCESS_PRIMARY_OK; internal bool _ROOMACCESS_SECONDARY_OK; internal bool _isOwner; internal bool _hasRights; internal bool _isMuted; internal int _groupID; internal int _groupMemberRank; internal int _tradePartnerUID = -1; internal bool _tradeAccept; internal int[] _tradeItems = new int[65]; internal int _tradeItemCount; internal int _teleporterID; internal bool _hostsEvent; internal List _ignoredUsers; private virtualSongEditor songEditor; internal List Badges = new List(); #endregion #region Constructors/destructors /// /// Initializes a new virtual user, and starts packet transfer between client and asynchronous socket server. /// /// The ID of the new connection. /// The socket of the new connection. public virtualUser(int connectionID, Socket connectionSocket) { this.Response = new FuseBuilder(); this.connectionID = connectionID; this.connectionSocket = connectionSocket; try { string banReason = userManager.getBanReason(this.connectionRemoteIP); if (banReason != "") { sendData("@c" + banReason); Disconnect(); } else { pingOK = true; sendData("@@"); connectionSocket.BeginReceive(dataBuffer, 0, dataBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null); } } catch { } } #endregion #region Connection management /// /// Immediately completes the current data transfer [if any], disconnects the client and flags the connection slot as free. /// internal void Disconnect() { if (_isDisconnected) return; try { if (Room != null && roomUser != null) Room.removeUser(roomUser.roomUID, false, ""); if (Messenger != null) Messenger.Clear(); connectionSocket.Dispose(); connectionSocket = null; userManager.removeUser(userID); Socketservers.gameSocketServer.freeConnection(connectionID); _isDisconnected = true; } catch { } } /// /// Disables receiving on the socket, sleeps for a specified amount of time [ms] and disconnects via normal Disconnect() void. Asynchronous. /// /// internal void Disconnect(int ms) { new timedDisconnector(delDisconnectTimed).BeginInvoke(ms, null, null); } private void delDisconnectTimed(int ms) { connectionSocket.Shutdown(SocketShutdown.Receive); Thread.Sleep(ms); Disconnect(); } /// /// Returns the IP address of this connection as a string. /// internal string connectionRemoteIP { get { return connectionSocket.RemoteEndPoint.ToString().Split(':')[0]; } } #endregion #region Data receiving /// /// This void is triggered when a new datapacket arrives at the socket of this user. The packet is separated and processed. On errors, the client is disconnected. /// /// The IAsyncResult of this BeginReceive asynchronous action. private void dataArrival(IAsyncResult iAr) { try { int bytesReceived = connectionSocket.EndReceive(iAr); string connectionData = System.Text.Encoding.Default.GetString(dataBuffer, 0, bytesReceived); while (connectionData != "") { int v = Encoding.decodeB64(connectionData.Substring(1, 2)); try { processPacket(FuseMessage.Parse(connectionData.Substring(3, v))); } catch (Exception x) { Out.WriteError(x.ToString()); } connectionData = connectionData.Substring(v + 3); Out.WriteTrace("Processing packet part"); } connectionSocket.BeginReceive(dataBuffer, 0, dataBuffer.Length, SocketFlags.None, new AsyncCallback(dataArrival), null); } catch { Disconnect(); } } #endregion #region Data sending /// /// Sends a single packet to the client via an asynchronous BeginSend action. /// /// The string of data to send. char[01] is added. internal void sendData(string Data) { try { byte[] dataBytes = System.Text.Encoding.Default.GetBytes(Data + Convert.ToChar(1)); connectionSocket.BeginSend(dataBytes, 0, dataBytes.Length, 0, new AsyncCallback(sentData), null); Out.WriteSpecialLine("[" + connectionID + "] <-- [" + Data.Replace(Convert.ToChar(13).ToString(), "{13}").Replace(Convert.ToChar(9).ToString(), "{9}") + "]", Out.logFlags.MehAction, ConsoleColor.White, ConsoleColor.DarkYellow, "> [" + Thread.GetDomainID()+ "]", 2, ConsoleColor.Yellow); } catch { Disconnect(); } } internal void sendData(FuseBuilder builder) { sendData(builder.ToString()); } internal void SendResponse() { sendData(Response.ToString()); Response = new FuseBuilder(); } /// /// Triggered when an asynchronous BeginSend action is completed. Virtual user completes the transfer action and leaves asynchronous action. /// /// The IAsyncResult of this BeginSend asynchronous action. private void sentData(IAsyncResult iAr) { try {connectionSocket.EndSend(iAr);} catch {Disconnect();} } #endregion #region Packet processing /// /// Processes a single packet from the client. /// /// The packet to process. private void processPacket(FuseMessage Request) { string currentPacket = Request.GetPacket; Out.WriteSpecialLine("[" + connectionID + "] --> [" + Request.GetPacket.Replace(Convert.ToChar(13).ToString(), "{13}").Replace(Convert.ToChar(9).ToString(), "{9}") + "]", Out.logFlags.MehAction, ConsoleColor.DarkGray, ConsoleColor.DarkYellow, "< [" + Thread.GetDomainID() + "]", 2, ConsoleColor.Yellow); { if (_isLoggedIn == false) #region Non-logged in packet processing { switch (currentPacket.Substring(0, 2)) { case "CD": { pingOK = true; break; } case "CN": { //Response.Initalize(277); // "DU" //Response.AppendWired(0); //SendResponse(); sendData("DU6ab7d29486b287c24b967d41015b8357" + Convert.ToChar(2) + "H"); break; } case "_R": { //string k = Request.PopString(); //sendData("@A72466831373652467611253150389348003020703652887606363308547580350442546712079"); Response.Initalize(257); // "DA" Response.AppendWired(9); Response.AppendWired(0); Response.AppendWired(0); Response.AppendWired(1); Response.AppendWired(1); Response.AppendWired(3); Response.AppendWired(0); Response.AppendWired(2); Response.AppendWired(1); Response.AppendWired(4); Response.AppendWired(0); Response.AppendWired(5); Response.AppendString("dd-MM-yyyy"); Response.AppendWired(7); Response.AppendWired(0); Response.AppendWired(8); Response.AppendString("http://hotell.habroxhotell.net/"); Response.AppendWired(9); Response.AppendWired(0); Response.AppendWired(1); Response.AppendWired(2); Response.AppendWired(-91); Response.AppendWired(-90); Response.AppendWired(59); Response.AppendWired(3); Response.AppendWired(13); Response.AppendWired(-2); Response.AppendWired(-9); Response.AppendWired(2); Response.AppendWired(1); Response.AppendWired(55); Response.AppendWired(51); Response.AppendWired(3); Response.AppendWired(-85); Response.AppendWired(-3); Response.AppendWired(2); Response.AppendWired(3); Response.AppendWired(-3); Response.AppendWired(0); Response.AppendWired(2); Response.AppendWired(65); Response.AppendWired(-2); Response.AppendWired(11); Response.AppendWired(1); Response.AppendWired(78); Response.AppendWired(-70); Response.AppendWired(2); Response.AppendWired(98); Response.AppendWired(3910); Response.AppendWired(-28); Response.AppendWired(52); Response.AppendWired(-2); Response.AppendWired(2); Response.AppendWired(1); Response.AppendWired(0); Response.AppendWired(0); Response.AppendWired(-42); Response.AppendWired(3); Response.AppendWired(74); Response.AppendWired(-49); Response.AppendWired(2); Response.AppendWired(0); Response.AppendWired(-61); SendResponse(); break; } case "CL": { string ssoTicket = Request.PopString(); int myID = 0; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("sso", ssoTicket); myID = dbClient.ReadInt32("SELECT id FROM users WHERE ticket_sso = @sso AND ipaddress_last = '" + connectionRemoteIP + "'"); } if (myID == 0) // No user found for this sso ticket and/or IP address { Disconnect(); return; } string banReason = userManager.getBanReason(myID); if (banReason != "") { Response.Initalize(35); // "@c" Response.Append(banReason); // We need to let the user read the ban reason Disconnect(10000); // 10 sec! return; } this.userID = myID; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { DataRow row = dbClient.ReadDataRow("SELECT * FROM users WHERE id = '" + myID + "'"); _Username = row["name"].ToString(); _Figure = row["figure"].ToString(); _Sex = char.Parse(row["sex"].ToString()); _Mission = row["mission"].ToString(); _Rank = byte.Parse(row["rank"].ToString()); } userManager.addUser(myID, this); _isLoggedIn = true; Response.Initalize(2); // "@B" Response.Append(rankManager.fuseRights(_Rank)); SendResponse(); Response.Initalize(290); // "Db" Response.AppendWired(1); Response.AppendWired(0); SendResponse(); Response.Initalize(3); // "@C" SendResponse(); if (Config.enableWelcomeMessage) sendData("BK" + stringManager.getString("welcomemessage_text")); break; } default: Disconnect(); break; } } #endregion else #region Logged-in packet processing { switch (currentPacket.Substring(0, 2)) { #region Misc case "CD": // Client - response to @r ping { pingOK = true; break; } case "@q": // Client - request current date { Response.Initalize(163); // "Bc" Response.Append(DateTime.Today.ToShortDateString()); SendResponse(); break; } case "BA": // Purse - redeem credit voucher { string Code = Request.PopString(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("code", Code); if (dbClient.Exists("SELECT * FROM vouchers WHERE voucher = @code")) { int voucherAmount = dbClient.ReadInt32("SELECT credits FROM vouchers WHERE voucher = @code"); dbClient.ExecuteQuery("DELETE FROM vouchers WHERE voucher = @code"); _Credits += voucherAmount; Response.Initalize(6); // "@F" Response.Append(_Credits); SendResponse(); Response.Initalize(212); // "CT" SendResponse(); dbClient.ExecuteQuery("UPDATE users SET credits = '" + _Credits + "' WHERE id = '" + userID + "'"); } else { Response.Initalize(213); // "CU" Response.Append(1); SendResponse(); } } break; } #endregion #region Login case "@L": // Login - initialize messenger { Messenger = new Messenger.virtualMessenger(userID); Response.Initalize(12); // "@L" Response.Append(Messenger.friendList()); SendResponse(); break; } case "Ci": // "FRIENDLIST_GETFRIENDREQUESTS" { Response.Initalize(314); // "Dz" Response.Append(Messenger.friendRequests()); SendResponse(); break; } case "EA": // "GET_IGNORE_LIST" { refreshIgnoreList(); break; } case "@Z": // Login - initialize Club subscription status { refreshClub(); break; } case "@G": // Login - initialize/refresh appearance { refreshAppearance(false, true, false); } break; case "@H": // Login - initialize/refresh valueables [credits, tickets, etc] { refreshValueables(true, true); break; } case "B]": // Login - initialize/refresh badges { refreshBadges(); break; } case "Cd": // Login - initialize/refresh group status { refreshGroupStatus(); break; } case "C^": // Recycler - receive recycler setup { Response.Initalize(303); // "Do" Response.Append(recyclerManager.setupString); SendResponse(); break; } case "C_": // Recycler - receive recycler session status { Response.Initalize(304); // "Dp" Response.Append(recyclerManager.sessionString(userID)); SendResponse(); break; } #endregion #region Messenger case "@g": // Messenger - request user as friend { if (Messenger != null) { string Username = Request.PopString(); int toID = userManager.getUserID(Username); if (toID > 0 && Messenger.hasFriendRequests(toID) == false && Messenger.hasFriendship(toID) == false) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { int requestID = dbClient.ReadInt32("SELECT MAX(requestid) FROM messenger_friendrequests WHERE userid_to = '" + toID + "'") + 1; dbClient.ExecuteQuery("INSERT INTO messenger_friendrequests(userid_to,userid_from,requestid) VALUES ('" + toID + "','" + userID + "','" + requestID + "')"); } FuseBuilder Message = new FuseBuilder(132); // "BD" Message.AppendWired(1); Message.AppendString(_Username); Message.AppendString(userID); userManager.getUser(toID).sendData(Message); } } break; } case "@e": // Messenger - accept friendrequest(s) { if (Messenger != null) { int Amount = Request.PopWiredInt(); int updateAmount = 0; StringBuilder Updates = new StringBuilder(); virtualBuddy Me = new virtualBuddy(userID); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) for (int i = 0; i < Amount; i++) { int requestID = Request.PopWiredInt(); int fromUserID = dbClient.ReadInt32("SELECT userid_from FROM messenger_friendrequests WHERE userid_to = '" + this.userID + "' AND requestid = '" + requestID + "'"); if (fromUserID == 0) // Corrupt data return; virtualBuddy Buddy = new virtualBuddy(fromUserID); Updates.Append(Buddy.ToString(true)); updateAmount++; Messenger.addBuddy(Buddy, false); if (userManager.containsUser(fromUserID)) userManager.getUser(fromUserID).Messenger.addBuddy(Me, true); dbClient.ExecuteQuery("INSERT INTO messenger_friendships(userid,friendid) VALUES ('" + fromUserID + "','" + this.userID + "')"); dbClient.ExecuteQuery("DELETE FROM messenger_friendrequests WHERE userid_to = '" + this.userID + "' AND requestid = '" + requestID + "' LIMIT 1"); } if (updateAmount > 0) { Response.Initalize(13); // "@M" Response.AppendWired(0); Response.AppendWired(1); Response.AppendWired(updateAmount); Response.Append(Updates.ToString()); SendResponse(); } } break; } case "@f": // Messenger - decline friendrequests { if (Messenger != null) { int Amount = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) for (int i = 0; i < Amount; i++) { int requestID = Request.PopWiredInt(); dbClient.ExecuteQuery("DELETE FROM messenger_friendrequests WHERE userid_to = '" + this.userID + "' AND requestid = '" + requestID + "' LIMIT 1"); } } break; } case "@h": // Messenger - remove buddy from friendlist { if (Messenger != null) { int trash = Request.PopWiredInt(); // Don't know what this is for, maybe amount? int buddyID = Request.PopWiredInt(); Messenger.removeBuddy(buddyID); if (userManager.containsUser(buddyID)) userManager.getUser(buddyID).Messenger.removeBuddy(userID); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("DELETE FROM messenger_friendships WHERE (userid = '" + userID + "' AND friendid = '" + buddyID + "') OR (userid = '" + buddyID + "' AND friendid = '" + userID + "') LIMIT 1"); } break; } case "@a": // Messenger - send instant message to buddy { if (Messenger != null) { int buddyID = Encoding.decodeVL64(currentPacket.Substring(2)); string Message = currentPacket.Substring(Encoding.encodeVL64(buddyID).Length + 4); Message = stringManager.filterSwearwords(Message); // Filter swearwords if (Messenger.containsOnlineBuddy(buddyID)) // Buddy online userManager.getUser(buddyID).sendData("BF" + Encoding.encodeVL64(userID) + Message + Convert.ToChar(2)); else // Buddy offline (or user doesn't has user in buddylist) sendData("DE" + Encoding.encodeVL64(5) + Encoding.encodeVL64(userID)); } break; } case "@O": // Messenger - refresh friendlist { if (Messenger != null) sendData("@M" + Messenger.getUpdates()); break; } case "DF": // Messenger - follow buddy to a room { if (Messenger != null) { int ID = Encoding.decodeVL64(currentPacket.Substring(2)); int errorID = -1; if (Messenger.hasFriendship(ID)) // Has friendship with user { if (userManager.containsUser(ID)) // User is online { virtualUser _User = userManager.getUser(ID); if (_User._roomID > 0) // User is in room { if (_User._inPublicroom) sendData("D^" + "I" + Encoding.encodeVL64(_User._roomID)); else sendData("D^" + "H" + Encoding.encodeVL64(_User._roomID)); } else // User is not in a room errorID = 2; } else // User is offline errorID = 1; } else // User is not this virtual user's friend errorID = 0; if (errorID != -1) // Error occured sendData("E]" + Encoding.encodeVL64(errorID)); } break; } case "@b": // Messenger - invite buddies to your room { if (Messenger != null && roomUser != null) { int Amount = Encoding.decodeVL64(currentPacket.Substring(2)); int[] IDs = new int[Amount]; currentPacket = currentPacket.Substring(Encoding.encodeVL64(Amount).Length + 2); for (int i = 0; i < Amount; i++) { if (currentPacket == "") return; int ID = Encoding.decodeVL64(currentPacket); if (Messenger.hasFriendship(ID) && userManager.containsUser(ID)) IDs[i] = ID; currentPacket = currentPacket.Substring(Encoding.encodeVL64(ID).Length); } string Message = currentPacket.Substring(2); string Data = "BG" + Encoding.encodeVL64(userID) + Message + Convert.ToChar(2); for (int i = 0; i < Amount; i++) userManager.getUser(IDs[i]).sendData(Data); } break; } #endregion #region Navigator actions case "BV": // Navigator - navigate through rooms and categories { try { bool hideFull = Request.PopWiredBoolean(); int cataID = Request.PopWiredInt(); DataRow row; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { row = dbClient.ReadDataRow("SELECT name,type,parent FROM room_categories WHERE id = '" + cataID + "' AND (access_rank_min <= " + _Rank + " OR access_rank_hideforlower = '0')"); if (row == null) // User has no access to this category/it does not exist return; } Response.Initalize(220); // "C\" Response.AppendBoolean(hideFull); Response.AppendWired(cataID); Response.AppendWired(row[1]); Response.AppendString(row[0]); Response.AppendWired(0); Response.AppendWired(10000); Response.AppendWired(row[2]); string _SQL_ORDER_HELPER = ""; if (row[1].ToString() == "0") // Publicrooms { if (hideFull) _SQL_ORDER_HELPER = "AND visitors_now < visitors_max ORDER BY id ASC"; else _SQL_ORDER_HELPER = "ORDER BY id ASC"; } else // Guestrooms { if (hideFull) _SQL_ORDER_HELPER = "AND visitors_now < visitors_max ORDER BY visitors_now DESC LIMIT 30"; else _SQL_ORDER_HELPER = "ORDER BY visitors_now DESC LIMIT " + Config.Navigator_openCategory_maxResults; } using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { DataTable table = dbClient.ReadDataTable("SELECT * FROM rooms WHERE category = '" + cataID + "' " + _SQL_ORDER_HELPER); if (row[1].ToString() == "2") // Guestroom Response.AppendWired(table.Rows.Count); foreach (DataRow dRow in table.Rows) { Response.AppendWired(dRow["id"]); if (row[1].ToString() == "0") // Publicroom { Response.AppendWired(1); Response.AppendString(dRow["name"]); if (roomManager.containsRoom(Convert.ToInt32(dRow["id"]))) Response.AppendWired(roomManager.getRoom(Convert.ToInt32(dRow["id"])).Users.Count); else Response.AppendWired(0); Response.AppendWired(dRow["visitors_max"]); Response.AppendWired(cataID); Response.AppendString(dRow["description"]); Response.AppendWired(dRow["id"]); Response.AppendWired(0); Response.AppendString(dRow["ccts"]); Response.AppendWired(0); Response.AppendWired(1); } else // Guestroom { if (dRow["showname"].ToString() == "0" && rankManager.containsRight(_Rank, "fuse_enter_locked_rooms") == false) continue; else { Response.AppendString(dRow["name"]); Response.AppendString(dRow["owner"]); Response.AppendString(roomManager.getRoomState(Convert.ToInt32(dRow["state"]))); if (roomManager.containsRoom(Convert.ToInt32(dRow["id"]))) Response.AppendWired(roomManager.getRoom(Convert.ToInt32(dRow["id"])).Users.Count); else Response.AppendWired(0); Response.AppendWired(dRow["visitors_max"]); Response.AppendString(dRow["description"]); } } } foreach (DataRow dRow in dbClient.ReadDataTable("SELECT * FROM room_categories WHERE parent = '" + cataID + "' AND (access_rank_min <= " + _Rank + " OR access_rank_hideforlower = '0') ORDER BY id ASC").Rows) { Response.AppendWired(dRow["id"]); Response.AppendWired(0); Response.AppendString(dRow["name"]); Response.AppendWired(roomManager.getUserCount(Convert.ToInt32(dRow["id"]))); Response.AppendWired(dbClient.ReadInt32("SELECT SUM(visitors_max) FROM rooms WHERE category = '" + dRow["id"] + "'")); Response.AppendWired(cataID); } } SendResponse(); } catch (Exception x) { Out.WriteError(x.ToString()); } break; } case "BW": // Navigator - request index of categories to place guestroom on { Response.Initalize(221); // "C]" using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { DataTable table = dbClient.ReadDataTable("SELECT id,name FROM room_categories WHERE type = '2' AND parent > 0 AND access_rank_min <= " + _Rank + " ORDER BY id ASC"); Response.AppendWired(table.Rows.Count); foreach (DataRow row in table.Rows) { Response.AppendWired(row[0]); Response.AppendString(row[1]); } } SendResponse(); break; } case "DH": // Navigator - refresh recommended rooms (random guestrooms) { Response.Initalize(351); // "E_" using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { DataTable table = dbClient.ReadDataTable("SELECT id,name,owner,description,state,visitors_now,visitors_max FROM rooms WHERE NOT(owner IS NULL) ORDER BY RAND() LIMIT 3"); Response.AppendWired(table.Rows.Count); foreach (DataRow row in table.Rows) { Response.AppendWired(row[0]); Response.AppendString(row[1]); Response.AppendString(row[2]); Response.AppendString(roomManager.getRoomState(Convert.ToInt32(row[4]))); if (roomManager.containsRoom(Convert.ToInt32(row[0]))) Response.AppendWired(roomManager.getRoom(Convert.ToInt32(row[0])).Users.Count); else Response.AppendWired(0); Response.AppendWired(row[6]); Response.AppendString(row[3]); } } SendResponse(); break; } case "@P": // Navigator - view user's own guestrooms { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { DataTable table = dbClient.ReadDataTable("SELECT * FROM rooms WHERE owner = '" + _Username + "'"); if (table.Rows.Count > 0) { Response.Initalize(16); // "@P" foreach (DataRow row in table.Rows) { Response.AppendString(row["id"], 9); Response.AppendString(row["name"], 9); Response.AppendString(_Username, 9); Response.AppendString(roomManager.getRoomState(Convert.ToInt32(row["state"])), 9); Response.AppendString("x", 9); if (roomManager.containsRoom(Convert.ToInt32(row["id"]))) Response.AppendString(roomManager.getRoom(Convert.ToInt32(row["id"])).Users.Count, 9); else Response.AppendString(0, 9); Response.AppendString(row["visitors_max"], 9); Response.AppendString("null", 9); Response.AppendString(row["description"], 9); Response.AppendString(row["description"], 9); Response.AppendChar(13); } SendResponse(); } else { Response.Initalize(57); // "@y" Response.Append(_Username); SendResponse(); } } break; } case "@Q": // Navigator - perform guestroom search on name/owner with a given criticeria { bool seeAllRoomOwners = rankManager.containsRight(_Rank, "fuse_see_all_roomowners"); string _SEARCH = Request.Content; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("search", _SEARCH); DataTable table = dbClient.ReadDataTable("SELECT * FROM rooms WHERE NOT(owner IS NULL) AND (owner LIKE CONCAT(@search,'%') OR name LIKE CONCAT('%',@search,'%')) ORDER BY id ASC LIMIT " + Config.Navigator_roomSearch_maxResults); if (table.Rows.Count > 0) { Response.Initalize(55); // "@w" foreach (DataRow row in table.Rows) { if (row["showname"].ToString() == "0" && row["owner"].ToString() != _Username && seeAllRoomOwners == false) // The room owner has hidden his name at the guestroom and this user hasn't got the fuseright to see all room owners row["owner"] = "-"; Response.AppendString(row["id"], 9); Response.AppendString(row["name"], 9); Response.AppendString(row["owner"], 9); Response.AppendString(roomManager.getRoomState(Convert.ToInt32(row["state"])), 9); Response.AppendString("x", 9); if (roomManager.containsRoom(Convert.ToInt32(row["id"]))) Response.AppendString(roomManager.getRoom(Convert.ToInt32(row["id"])).Users.Count, 9); else Response.AppendString(0, 9); Response.AppendString(row["visitors_max"], 9); Response.AppendString("null", 9); Response.AppendString(row["description"], 9); Response.AppendString(row["description"], 9); Response.AppendChar(13); } SendResponse(); } else { Response.Initalize(58); // "@z" SendResponse(); } } break; } case "@U": // Navigator - get guestroom details { int roomID = int.Parse(Request.Content); DataRow row; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { row = dbClient.ReadDataRow("SELECT name,owner,description,model,state,superusers,showname,category,visitors_max FROM rooms WHERE id = '" + roomID + "' AND NOT(owner IS NULL)"); } if (row != null) { Response.Initalize(54); // "@v" Response.AppendWired(row[5]); Response.AppendWired(row[4]); Response.AppendWired(roomID); if (row[6].ToString() == "0" && rankManager.containsRight(_Rank, "fuse_see_all_roomowners")) // The room owner has decided to hide his name at this room, and this user hasn't got the fuseright to see all room owners, hide the name Response.AppendString("-"); else Response.AppendString(row[1]); Response.Append("model_"); Response.AppendString(row[3]); Response.AppendString(row[0]); Response.AppendString(row[2]); Response.AppendWired(row[6]); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) Response.AppendBoolean(dbClient.Exists("SELECT id FROM room_categories WHERE id = '" + row[7] + "' AND trading = '1'")); if (roomManager.containsRoom(Convert.ToInt32(roomID))) Response.AppendWired(roomManager.getRoom(Convert.ToInt32(roomID)).Users.Count); else Response.AppendWired(0); Response.AppendWired(row[8]); } SendResponse(); break; } case "@R": // Navigator - initialize user's favorite rooms { int guestRooms = 0; FuseBuilder Message = new FuseBuilder(); Response.Initalize(61); // "@}" Response.AppendWired(0); Response.AppendWired(0); Response.AppendWired(2); Response.AppendChar(2); Response.AppendWired(0); Response.AppendWired(0); Response.AppendWired(0); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) foreach (DataRow row in dbClient.ReadDataColumn("SELECT roomid FROM users_favourites WHERE userid = '" + userID + "' ORDER BY roomid DESC").Table.Rows) { DataRow roomRow = dbClient.ReadDataRow("SELECT * FROM rooms WHERE id = " + row[0]); if (roomRow["owner"].ToString() != "" && roomRow["ccts"] != DBNull.Value) // Guestroom { if (roomRow["showname"].ToString() == "0" && _Username != roomRow["owner"].ToString() && rankManager.containsRight(_Rank, "fuse_enter_locked_rooms") == false) // Room owner doesn't wish to show his name, and this user isn't the room owner and this user doesn't has the right to see hidden room owners, change room owner to '-' roomRow["owner"] = "-"; Message.AppendWired(row["id"]); Message.AppendString(row["name"]); Message.AppendString(row["owner"]); Message.AppendString(roomManager.getRoomState(Convert.ToInt32(roomRow["state"]))); if (roomManager.containsRoom(Convert.ToInt32(roomRow["id"]))) Message.AppendWired(roomManager.getRoom(Convert.ToInt32(roomRow["id"])).Users.Count); else Message.AppendWired(0); Message.AppendWired(roomRow["visitors_max"]); Message.AppendString(roomRow["description"]); guestRooms++; } else { Message.AppendWired(roomRow["id"]); Message.AppendBoolean(true); Message.AppendString(roomRow["name"]); if (roomManager.containsRoom(Convert.ToInt32(roomRow["id"]))) Message.AppendWired(roomManager.getRoom(Convert.ToInt32(roomRow["id"])).Users.Count); else Message.AppendWired(0); Message.AppendWired(roomRow["visitors_max"]); Message.AppendWired(roomRow["category"]); Message.AppendString(roomRow["description"]); } } Response.AppendWired(guestRooms); Response.Append(Message.ToString()); SendResponse(); break; } case "@S": // Navigator - add room to favourite rooms list { bool publicRoom = Request.PopWiredBoolean(); int roomID = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (dbClient.Exists("SELECT id FROM rooms WHERE id = '" + roomID + "'") == true && dbClient.Exists("SELECT userid FROM users_favourites WHERE userid = '" + userID + "' AND roomid = '" + roomID + "'") == false) // The virtual room does exist, and the virtual user hasn't got it in the list already { if (dbClient.ReadInt32("SELECT COUNT(userid) FROM users_favourites WHERE userid = '" + userID + "'") < Config.Navigator_Favourites_maxRooms) dbClient.ExecuteQuery("INSERT INTO users_favourites(userid,roomid) VALUES ('" + userID + "','" + roomID + "')"); else sendData("@a" + "nav_error_toomanyfavrooms"); } break; } case "@T": // Navigator - remove room from favourite rooms list { int roomID = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("DELETE FROM users_favourites WHERE userid = '" + userID + "' AND roomid = '" + roomID + "'"); break; } #endregion #region Room event actions case "EY": // Events - show/hide 'Host event' button if (_inPublicroom || roomUser == null || _hostsEvent) // In publicroom, not in room at all or already hosting event sendData("Eo" + "H"); // Hide else sendData("Eo" + "I"); // Show break; case "D{": // Events - check if event category is OK { int categoryID = Encoding.decodeVL64(currentPacket.Substring(2)); if (eventManager.categoryOK(categoryID)) sendData("Eb" + Encoding.encodeVL64(categoryID)); break; } case "E^": // Events - open category { int categoryID = Encoding.decodeVL64(currentPacket.Substring(2)); sendData("Ep" + Encoding.encodeVL64(eventManager.categoryAmount)); if (categoryID >= 1 && categoryID <= 11) sendData("Eq" + Encoding.encodeVL64(categoryID) + eventManager.getEvents(categoryID)); break; } case "EZ": // Events - create event { if (_isOwner && _hostsEvent == false && _inPublicroom == false && roomUser != null) { int categoryID = Encoding.decodeVL64(currentPacket.Substring(2)); if (eventManager.categoryOK(categoryID)) { int categoryLength = Encoding.encodeVL64(categoryID).Length; int nameLength = Encoding.decodeB64(currentPacket.Substring(categoryLength + 2, 2)); string Name = currentPacket.Substring(categoryLength + 4, nameLength); string Description = currentPacket.Substring(categoryLength + nameLength + 6); _hostsEvent = true; eventManager.createEvent(categoryID, userID, _roomID, Name, Description); Room.sendData("Er" + eventManager.getEvent(_roomID)); } } break; } case @"E\": // Events - edit event { if (_hostsEvent && _isOwner && _inPublicroom == false && roomUser != null) { int categoryID = Encoding.decodeVL64(currentPacket.Substring(2)); if (eventManager.categoryOK(categoryID)) { int categoryLength = Encoding.encodeVL64(categoryID).Length; int nameLength = Encoding.decodeB64(currentPacket.Substring(categoryLength + 2, 2)); string Name = currentPacket.Substring(categoryLength + 4, nameLength); string Description = currentPacket.Substring(categoryLength + nameLength + 6); eventManager.editEvent(categoryID, _roomID, Name, Description); Room.sendData("Er" + eventManager.getEvent(_roomID)); } } break; } case "E[": // Events - end event { if (_hostsEvent && _isOwner && _inPublicroom == false && roomUser != null) { _hostsEvent = false; eventManager.removeEvent(_roomID); Room.sendData("Er" + "-1"); } break; } #endregion #region Guestroom create and modify case "@]": // Create guestroom - phase 1 { string[] roomSettings = currentPacket.Split('/'); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (dbClient.ReadInt32("SELECT COUNT(*) FROM rooms WHERE owner = '" + _Username + "'") < Config.Navigator_createRoom_maxRooms) { roomSettings[2] = stringManager.filterSwearwords(roomSettings[2]); roomSettings[3] = roomSettings[3].Substring(6, 1); roomSettings[4] = roomManager.getRoomState(roomSettings[4]).ToString(); if (roomSettings[5] != "0" && roomSettings[5] != "1") return; dbClient.AddParamWithValue("name", roomSettings[2]); dbClient.AddParamWithValue("username", _Username); dbClient.AddParamWithValue("model", roomSettings[3]); dbClient.AddParamWithValue("state", roomSettings[4]); dbClient.AddParamWithValue("showname", roomSettings[5]); dbClient.ExecuteQuery("INSERT INTO rooms (name,owner,model,state,showname) VALUES (@name,@username,@model,@state,@showname)"); int roomID = dbClient.ReadInt32("SELECT MAX(id) FROM rooms WHERE owner = '" + _Username + "'"); Response.Initalize(59); // "@{" Response.AppendString(roomID, 13); Response.Append(roomSettings[2]); SendResponse(); } else { Response.Initalize(33); // "@a" Response.Append("Error creating a private room"); SendResponse(); } break; } case "@Y": // Create guestroom - phase 2 / modify guestroom { int roomID = 0; if (currentPacket.Substring(2, 1) == "/") roomID = int.Parse(Request.Content.Split('/')[1]); else roomID = int.Parse(Request.Content.Split('/')[0]); int superUsers = 0; int maxVisitors = 25; string[] packetContent = Request.Content.Split(Convert.ToChar(13)); string roomDescription = ""; string roomPassword = ""; for (int i = 1; i < packetContent.Length; i++) // More proper way, thanks Jeax { string updHeader = packetContent[i].Split('=')[0]; string updValue = packetContent[i].Substring(updHeader.Length + 1); switch (updHeader) { case "description": roomDescription = stringManager.filterSwearwords(updValue); break; case "allsuperuser": superUsers = int.Parse(updValue); if (superUsers != 0 && superUsers != 1) superUsers = 0; break; case "maxvisitors": maxVisitors = int.Parse(updValue); if (maxVisitors < 10 || maxVisitors > 25) maxVisitors = 25; break; case "password": roomPassword = updValue; break; default: return; } } using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("description", roomDescription); dbClient.AddParamWithValue("superusers", superUsers); dbClient.AddParamWithValue("visitors_max", maxVisitors); dbClient.AddParamWithValue("password", roomPassword); dbClient.AddParamWithValue("id", roomID); dbClient.AddParamWithValue("owner", _Username); dbClient.ExecuteQuery("UPDATE rooms SET description = @description,superusers = @superusers,visitors_max = @visitors_max,password = @password WHERE id = @id AND owner = @owner LIMIT 1"); } break; } case "@X": // Modify guestroom, save name, state and show/hide ownername { string[] packetContent = Request.Content.Split('/'); int roomID = int.Parse(packetContent[0]); string roomName = packetContent[1]; string showName = packetContent[2]; if (showName != "1" && showName != "0") showName = "1"; int roomState = roomManager.getRoomState(packetContent[2]); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("id", roomID); dbClient.AddParamWithValue("owner", _Username); dbClient.AddParamWithValue("name", roomName); dbClient.AddParamWithValue("state", roomState); dbClient.AddParamWithValue("showname", showName); dbClient.ExecuteQuery("UPDATE rooms SET name = @name,state = @state,showname = @showname WHERE id = @id AND owner = @owner LIMIT 1"); } break; } case "BX": // Navigator - trigger guestroom modify { int roomID = Request.PopWiredInt(); string roomCategory; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) roomCategory = dbClient.ReadString("SELECT category FROM rooms WHERE id = '" + roomID + "' AND owner = '" + _Username + "'"); if (roomCategory != "") { Response.Initalize(222); // "C^" Response.AppendWired(roomID); Response.AppendWired(roomCategory); SendResponse(); } break; } case "BY": // Navigator - edit category of a guestroom { int roomID = Request.PopWiredInt(); int cataID = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (dbClient.Exists("SELECT id FROM room_categories WHERE id = '" + cataID + "' AND type = '2' AND parent > 0 AND access_rank_min <= " + _Rank)) // Category is valid for this user dbClient.ExecuteQuery("UPDATE rooms SET category = '" + cataID + "' WHERE id = '" + roomID + "' AND owner = '" + _Username + "' LIMIT 1"); break; } case "BZ": // Navigator - 'Who's in here' feature for public rooms { int roomID = Request.PopWiredInt(); Response.Initalize(223); // "C_" if (roomManager.containsRoom(roomID)) Response.Append(roomManager.getRoom(roomID).Userlist); SendResponse(); break; } #endregion #region Enter/leave room case "@u": // Rooms - leave room { if (Room != null && roomUser != null) Room.removeUser(roomUser.roomUID, false, ""); break; } case "Bv": // Enter room - loading screen advertisement { Config.Rooms_LoadAvertisement_img = ""; if (Config.Rooms_LoadAvertisement_img == "") sendData("DB0"); else sendData("DB" + Config.Rooms_LoadAvertisement_img + Convert.ToChar(9) + Config.Rooms_LoadAvertisement_uri); } break; case "@B": // Enter room - determine room and check state + max visitors override { bool isPublicroom = Request.PopBase64Boolean(); int roomID = Request.PopWiredInt(); sendData("@S"); sendData("Bf" + "http://hotell.habroxhotell.net/"); if (Room != null && roomUser != null) Room.removeUser(roomUser.roomUID, false, ""); if (_teleporterID == 0) { bool allowEnterLockedRooms = rankManager.containsRight(_Rank, "fuse_enter_locked_rooms"); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { int accessLevel = dbClient.ReadInt32("SELECT state FROM rooms WHERE id = '" + roomID + "'"); if (accessLevel == 3 && _clubMember == false && allowEnterLockedRooms == false) // Room is only for club subscribers and the user isn't club and hasn't got the fuseright for entering all rooms nomatter the state { sendData("C`" + "Kc"); return; } else if (accessLevel == 4 && allowEnterLockedRooms == false) // The room is only for staff and the user hasn't got the fuseright for entering all rooms nomatter the state { sendData("BK" + stringManager.getString("room_stafflocked")); return; } int nowVisitors = dbClient.ReadInt32("SELECT visitors_now FROM rooms WHERE id = '" + roomID + "'"); if (nowVisitors > 0) { int maxVisitors = dbClient.ReadInt32("SELECT visitors_max FROM rooms WHERE id = '" + roomID + "'"); if (nowVisitors >= maxVisitors && rankManager.containsRight(_Rank, "fuse_enter_full_rooms") == false) { if (isPublicroom == false) sendData("C`" + "I"); else sendData("BK" + stringManager.getString("room_full")); return; } } } } _roomID = roomID; _inPublicroom = isPublicroom; _ROOMACCESS_PRIMARY_OK = true; if (isPublicroom) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { string roomModel = dbClient.ReadString("SELECT model FROM rooms WHERE id = '" + roomID + "'"); sendData("AE" + roomModel + " " + roomID); } _ROOMACCESS_SECONDARY_OK = true; } break; } case "@v": // Enter room - guestroom - enter room by using a teleporter { Response.Initalize(19); // "@S" SendResponse(); break; } case "@y": // Enter room - guestroom - check roomban/password/doorbell { if (_inPublicroom == false) { if (_teleporterID == 0) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { int accessFlag = dbClient.ReadInt32("SELECT state FROM rooms WHERE id = '" + _roomID + "'"); if (_ROOMACCESS_PRIMARY_OK == false && accessFlag != 2) return; // Check for roombans if (dbClient.Exists("SELECT roomid FROM room_bans WHERE roomid = '" + _roomID + "' AND userid = '" + userID + "'")) { DateTime banExpireMoment = DateTime.Parse(dbClient.ReadString("SELECT ban_expire FROM room_bans WHERE roomid = '" + _roomID + "' AND userid = '" + userID + "'")); if (DateTime.Compare(banExpireMoment, DateTime.Now) > 0) { sendData("C`" + "PA"); sendData("@R"); return; } else dbClient.ExecuteQuery("DELETE FROM room_bans WHERE roomid = '" + _roomID + "' AND userid = '" + userID + "' LIMIT 1"); } if (rankManager.containsRight(_Rank, "fuse_enter_locked_rooms") == false) { if (accessFlag == 1) // Doorbell { if (roomManager.containsRoom(_roomID) == false) { sendData("BC"); return; } } else if (accessFlag == 2) // Password { string givenPassword = ""; try { givenPassword = currentPacket.Split('/')[1]; } catch { } string roomPassword = dbClient.ReadString("SELECT password FROM rooms WHERE id = '" + _roomID + "'"); if (givenPassword != roomPassword) { sendData("@a" + "Incorrect flat password"); return; } } } } } _ROOMACCESS_SECONDARY_OK = true; sendData("@i"); } break; } case "@{": // Enter room - guestroom - guestroom only data: model, wallpaper, rights, room votes { if (_ROOMACCESS_SECONDARY_OK && _inPublicroom == false) { DataRow row; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) row = dbClient.ReadDataRow("SELECT * FROM rooms WHERE id = '" + _roomID + "'"); sendData("AE" + "model_" + row["model"] + " " + _roomID); if (Convert.ToInt32(row["wallpaper"]) > 0) { Response.Initalize(46); // "@n" Response.Append("wallpaper/"); Response.Append(row["wallpaper"]); SendResponse(); } if (Convert.ToInt32(row["floor"]) > 0) { Response.Initalize(46); // "@n" Response.Append("floor/"); Response.Append(row["floor"]); SendResponse(); } Response.Initalize(46); // "@n" Response.Append("landscape/"); Response.Append(row["landscape"].ToString().Replace(',', '.')); SendResponse(); _isOwner = rankManager.containsRight(_Rank, "fuse_any_room_controller"); if (!_isOwner) { _isOwner = row["owner"].ToString() == _Username; if (_isOwner == false) using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) _hasRights = dbClient.Exists("SELECT userid FROM room_rights WHERE roomid = '" + _roomID + "' AND userid = '" + userID + "'"); if (_hasRights == false) _hasRights = row["superusers"].ToString() == "1"; } if (_isOwner) { _hasRights = true; Response.Initalize(47); // "@o" SendResponse(); } if (_hasRights) { Response.Initalize(42); // "@j" SendResponse(); } int voteAmount = -1; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (dbClient.Exists("SELECT userid FROM room_votes WHERE userid = '" + userID + "' AND roomid = '" + _roomID + "'")) { voteAmount = dbClient.ReadInt32("SELECT SUM(vote) FROM room_votes WHERE roomid = '" + _roomID + "'"); if (voteAmount < 0) { voteAmount = 0; } } sendData("EY" + Encoding.encodeVL64(voteAmount)); sendData("Er" + eventManager.getEvent(_roomID)); } break; } case "A~": // Enter room - get room advertisement { Response.Initalize(208); // "CP" using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (_inPublicroom && dbClient.Exists("SELECT roomid FROM room_ads WHERE roomid = '" + _roomID + "'")) { // TODO: Read row instead string advImg = dbClient.ReadString("SELECT img FROM room_ads WHERE roomid = '" + _roomID + "'"); string advUri = dbClient.ReadString("SELECT uri FROM room_ads WHERE roomid = '" + _roomID + "'"); Response.AppendString(advImg, 9); Response.Append(advUri); } else Response.Append(0); SendResponse(); break; } case "@|": // Enter room - get roomclass + get heightmap { if (_ROOMACCESS_SECONDARY_OK) { if (roomManager.containsRoom(_roomID)) Room = roomManager.getRoom(_roomID); else { Room = new virtualRoom(_roomID, _inPublicroom); roomManager.addRoom(_roomID, Room); } sendData("@_" + Room.Heightmap); sendData(@"@\" + Room.dynamicUnits); } break; } case "@}": // Enter room - get items { if (_ROOMACCESS_SECONDARY_OK && Room != null) { sendData("@^" + Room.PublicroomItems); sendData("@`" + Room.Flooritems); } break; } case "@~": // Enter room - get user status updates { if (_ROOMACCESS_SECONDARY_OK && Room != null) { sendData("DiH"); if (_receivedSpriteIndex == false) { sendData("Dg" + @"[_Dshelves_norjaX~Dshelves_polyfonYmAshelves_siloXQHtable_polyfon_smallYmAchair_polyfonZbBtable_norja_medY_Itable_silo_medX~Dtable_plasto_4legY_Itable_plasto_roundY_Itable_plasto_bigsquareY_Istand_polyfon_zZbBchair_siloX~Dsofa_siloX~Dcouch_norjaX~Dchair_norjaX~Dtable_polyfon_medYmAdoormat_loveZbBdoormat_plainZ[Msofachair_polyfonX~Dsofa_polyfonZ[Msofachair_siloX~Dchair_plastyX~Dchair_plastoYmAtable_plasto_squareY_Ibed_polyfonX~Dbed_polyfon_one[dObed_trad_oneYmAbed_tradYmAbed_silo_oneYmAbed_silo_twoYmAtable_silo_smallX~Dbed_armas_twoYmAbed_budget_oneXQHbed_budgetXQHshelves_armasYmAbench_armasYmAtable_armasYmAsmall_table_armasZbBsmall_chair_armasYmAfireplace_armasYmAlamp_armasYmAbed_armas_oneYmAcarpet_standardY_Icarpet_armasYmAcarpet_polarY_Ifireplace_polyfonY_Itable_plasto_4leg*1Y_Itable_plasto_bigsquare*1Y_Itable_plasto_round*1Y_Itable_plasto_square*1Y_Ichair_plasto*1YmAcarpet_standard*1Y_Idoormat_plain*1Z[Mtable_plasto_4leg*2Y_Itable_plasto_bigsquare*2Y_Itable_plasto_round*2Y_Itable_plasto_square*2Y_Ichair_plasto*2YmAdoormat_plain*2Z[Mcarpet_standard*2Y_Itable_plasto_4leg*3Y_Itable_plasto_bigsquare*3Y_Itable_plasto_round*3Y_Itable_plasto_square*3Y_Ichair_plasto*3YmAcarpet_standard*3Y_Idoormat_plain*3Z[Mtable_plasto_4leg*4Y_Itable_plasto_bigsquare*4Y_Itable_plasto_round*4Y_Itable_plasto_square*4Y_Ichair_plasto*4YmAcarpet_standard*4Y_Idoormat_plain*4Z[Mdoormat_plain*6Z[Mdoormat_plain*5Z[Mcarpet_standard*5Y_Itable_plasto_4leg*5Y_Itable_plasto_bigsquare*5Y_Itable_plasto_round*5Y_Itable_plasto_square*5Y_Ichair_plasto*5YmAtable_plasto_4leg*6Y_Itable_plasto_bigsquare*6Y_Itable_plasto_round*6Y_Itable_plasto_square*6Y_Ichair_plasto*6YmAtable_plasto_4leg*7Y_Itable_plasto_bigsquare*7Y_Itable_plasto_round*7Y_Itable_plasto_square*7Y_Ichair_plasto*7YmAtable_plasto_4leg*8Y_Itable_plasto_bigsquare*8Y_Itable_plasto_round*8Y_Itable_plasto_square*8Y_Ichair_plasto*8YmAtable_plasto_4leg*9Y_Itable_plasto_bigsquare*9Y_Itable_plasto_round*9Y_Itable_plasto_square*9Y_Ichair_plasto*9YmAcarpet_standard*6Y_Ichair_plasty*1X~DpizzaYmAdrinksYmAchair_plasty*2X~Dchair_plasty*3X~Dchair_plasty*4X~Dbar_polyfonY_Iplant_cruddyYmAbottleYmAbardesk_polyfonX~Dbardeskcorner_polyfonX~DfloortileHbar_armasY_Ibartable_armasYmAbar_chair_armasYmAcarpet_softZ@Kcarpet_soft*1Z@Kcarpet_soft*2Z@Kcarpet_soft*3Z@Kcarpet_soft*4Z@Kcarpet_soft*5Z@Kcarpet_soft*6Z@Kred_tvY_Iwood_tvYmAcarpet_polar*1Y_Ichair_plasty*5X~Dcarpet_polar*2Y_Icarpet_polar*3Y_Icarpet_polar*4Y_Ichair_plasty*6X~Dtable_polyfonYmAsmooth_table_polyfonYmAsofachair_polyfon_girlX~Dbed_polyfon_girl_one[dObed_polyfon_girlX~Dsofa_polyfon_girlZ[Mbed_budgetb_oneXQHbed_budgetbXQHplant_pineappleYmAplant_fruittreeY_Iplant_small_cactusY_Iplant_bonsaiY_Iplant_big_cactusY_Iplant_yukkaY_Icarpet_standard*7Y_Icarpet_standard*8Y_Icarpet_standard*9Y_Icarpet_standard*aY_Icarpet_standard*bY_Iplant_sunflowerY_Iplant_roseY_Itv_luxusY_IbathZ\BsinkY_ItoiletYmAduckYmAtileYmAtoilet_redYmAtoilet_yellYmAtile_redYmAtile_yellYmApresent_gen[~Npresent_gen1[~Npresent_gen2[~Npresent_gen3[~Npresent_gen4[~Npresent_gen5[~Npresent_gen6[~Nbar_basicY_Ishelves_basicXQHsoft_sofachair_norjaX~Dsoft_sofa_norjaX~Dlamp_basicXQHlamp2_armasYmAfridgeY_Idoor[dOdoorB[dOdoorC[dOpumpkinYmAskullcandleYmAdeadduckYmAdeadduck2YmAdeadduck3YmAmenorahYmApuddingYmAhamYmAturkeyYmAxmasduckY_IhouseYmAtriplecandleYmAtree3YmAtree4YmAtree5X~Dham2YmAwcandlesetYmArcandlesetYmAstatueYmAheartY_IvaleduckYmAheartsofaX~DthroneYmAsamovarY_IgiftflowersY_IhabbocakeYmAhologramYmAeasterduckY_IbunnyYmAbasketY_IbirdieYmAediceX~Dclub_sofaZ[Mprize1YmAprize2YmAprize3YmAdivider_poly3X~Ddivider_arm1YmAdivider_arm2YmAdivider_arm3YmAdivider_nor1X~Ddivider_silo1X~Ddivider_nor2X~Ddivider_silo2Z[Mdivider_nor3X~Ddivider_silo3X~DtypingmachineYmAspyroYmAredhologramYmAcameraHjoulutahtiYmAhyacinth1YmAhyacinth2YmAchair_plasto*10YmAchair_plasto*11YmAbardeskcorner_polyfon*12X~Dbardeskcorner_polyfon*13X~Dchair_plasto*12YmAchair_plasto*13YmAchair_plasto*14YmAtable_plasto_4leg*14Y_ImocchamasterY_Icarpet_legocourtYmAbench_legoYmAlegotrophyYmAvalentinescreenYmAedicehcYmArare_daffodil_rugYmArare_beehive_bulbY_IhcsohvaYmAhcammeYmArare_elephant_statueYmArare_fountainY_Irare_standYmArare_globeYmArare_hammockYmArare_elephant_statue*1YmArare_elephant_statue*2YmArare_fountain*1Y_Irare_fountain*2Y_Irare_fountain*3Y_Irare_beehive_bulb*1Y_Irare_beehive_bulb*2Y_Irare_xmas_screenY_Irare_parasol*1Y_Irare_parasol*2Y_Irare_parasol*3Y_Itree1X~Dtree2ZmBwcandleYxBrcandleYxBsoft_jaggara_norjaYmAhouse2YmAdjesko_turntableYmAmd_sofaZ[Mmd_limukaappiY_Itable_plasto_4leg*10Y_Itable_plasto_4leg*15Y_Itable_plasto_bigsquare*14Y_Itable_plasto_bigsquare*15Y_Itable_plasto_round*14Y_Itable_plasto_round*15Y_Itable_plasto_square*14Y_Itable_plasto_square*15Y_Ichair_plasto*15YmAchair_plasty*7X~Dchair_plasty*8X~Dchair_plasty*9X~Dchair_plasty*10X~Dchair_plasty*11X~Dchair_plasto*16YmAtable_plasto_4leg*16Y_Ihockey_scoreY_Ihockey_lightYmAdoorD[dOprizetrophy2*3[rIprizetrophy3*3XrIprizetrophy4*3[rIprizetrophy5*3[rIprizetrophy6*3[rIprizetrophy*1Y_Iprizetrophy2*1[rIprizetrophy3*1XrIprizetrophy4*1[rIprizetrophy5*1[rIprizetrophy6*1[rIprizetrophy*2Y_Iprizetrophy2*2[rIprizetrophy3*2XrIprizetrophy4*2[rIprizetrophy5*2[rIprizetrophy6*2[rIprizetrophy*3Y_Irare_parasol*0Hhc_lmp[fBhc_tblYmAhc_chrYmAhc_dskXQHnestHpetfood1ZvCpetfood2ZvCpetfood3ZvCwaterbowl*4XICwaterbowl*5XICwaterbowl*2XICwaterbowl*1XICwaterbowl*3XICtoy1XICtoy1*1XICtoy1*2XICtoy1*3XICtoy1*4XICgoodie1ZvCgoodie1*1ZvCgoodie1*2ZvCgoodie2X~Dprizetrophy7*3[rIprizetrophy7*1[rIprizetrophy7*2[rIscifiport*0Y_Iscifiport*9Y_Iscifiport*8Y_Iscifiport*7Y_Iscifiport*6Y_Iscifiport*5Y_Iscifiport*4Y_Iscifiport*3Y_Iscifiport*2Y_Iscifiport*1Y_Iscifirocket*9Y_Iscifirocket*8Y_Iscifirocket*7Y_Iscifirocket*6Y_Iscifirocket*5Y_Iscifirocket*4Y_Iscifirocket*3Y_Iscifirocket*2Y_Iscifirocket*1Y_Iscifirocket*0Y_Iscifidoor*10Y_Iscifidoor*9Y_Iscifidoor*8Y_Iscifidoor*7Y_Iscifidoor*6Y_Iscifidoor*5Y_Iscifidoor*4Y_Iscifidoor*3Y_Iscifidoor*2Y_Iscifidoor*1Y_Ipillow*5YmApillow*8YmApillow*0YmApillow*1YmApillow*2YmApillow*7YmApillow*9YmApillow*4YmApillow*6YmApillow*3YmAmarquee*1Y_Imarquee*2Y_Imarquee*7Y_Imarquee*aY_Imarquee*8Y_Imarquee*9Y_Imarquee*5Y_Imarquee*4Y_Imarquee*6Y_Imarquee*3Y_Iwooden_screen*1Y_Iwooden_screen*2Y_Iwooden_screen*7Y_Iwooden_screen*0Y_Iwooden_screen*8Y_Iwooden_screen*5Y_Iwooden_screen*9Y_Iwooden_screen*4Y_Iwooden_screen*6Y_Iwooden_screen*3Y_Ipillar*6Y_Ipillar*1Y_Ipillar*9Y_Ipillar*0Y_Ipillar*8Y_Ipillar*2Y_Ipillar*5Y_Ipillar*4Y_Ipillar*7Y_Ipillar*3Y_Irare_dragonlamp*4Y_Irare_dragonlamp*0Y_Irare_dragonlamp*5Y_Irare_dragonlamp*2Y_Irare_dragonlamp*8Y_Irare_dragonlamp*9Y_Irare_dragonlamp*7Y_Irare_dragonlamp*6Y_Irare_dragonlamp*1Y_Irare_dragonlamp*3Y_Irare_icecream*1Y_Irare_icecream*7Y_Irare_icecream*8Y_Irare_icecream*2Y_Irare_icecream*6Y_Irare_icecream*9Y_Irare_icecream*3Y_Irare_icecream*0Y_Irare_icecream*4Y_Irare_icecream*5Y_Irare_fan*7YxBrare_fan*6YxBrare_fan*9YxBrare_fan*3YxBrare_fan*0YxBrare_fan*4YxBrare_fan*5YxBrare_fan*1YxBrare_fan*8YxBrare_fan*2YxBqueue_tile1*3X~Dqueue_tile1*6X~Dqueue_tile1*4X~Dqueue_tile1*9X~Dqueue_tile1*8X~Dqueue_tile1*5X~Dqueue_tile1*7X~Dqueue_tile1*2X~Dqueue_tile1*1X~Dqueue_tile1*0X~DticketHrare_snowrugX~Dcn_lampZxIcn_sofaYmAsporttrack1*1YmAsporttrack1*3YmAsporttrack1*2YmAsporttrack2*1[~Nsporttrack2*2[~Nsporttrack2*3[~Nsporttrack3*1YmAsporttrack3*2YmAsporttrack3*3YmAfootylampX~Dbarchair_siloX~Ddivider_nor4*4X~Dtraffic_light*1ZxItraffic_light*2ZxItraffic_light*3ZxItraffic_light*4ZxItraffic_light*6ZxIrubberchair*1X~Drubberchair*2X~Drubberchair*3X~Drubberchair*4X~Drubberchair*5X~Drubberchair*6X~Dbarrier*1X~Dbarrier*2X~Dbarrier*3X~Drubberchair*7X~Drubberchair*8X~Dtable_norja_med*2Y_Itable_norja_med*3Y_Itable_norja_med*4Y_Itable_norja_med*5Y_Itable_norja_med*6Y_Itable_norja_med*7Y_Itable_norja_med*8Y_Itable_norja_med*9Y_Icouch_norja*2X~Dcouch_norja*3X~Dcouch_norja*4X~Dcouch_norja*5X~Dcouch_norja*6X~Dcouch_norja*7X~Dcouch_norja*8X~Dcouch_norja*9X~Dshelves_norja*2X~Dshelves_norja*3X~Dshelves_norja*4X~Dshelves_norja*5X~Dshelves_norja*6X~Dshelves_norja*7X~Dshelves_norja*8X~Dshelves_norja*9X~Dchair_norja*2X~Dchair_norja*3X~Dchair_norja*4X~Dchair_norja*5X~Dchair_norja*6X~Dchair_norja*7X~Dchair_norja*8X~Dchair_norja*9X~Ddivider_nor1*2X~Ddivider_nor1*3X~Ddivider_nor1*4X~Ddivider_nor1*5X~Ddivider_nor1*6X~Ddivider_nor1*7X~Ddivider_nor1*8X~Ddivider_nor1*9X~Dsoft_sofa_norja*2X~Dsoft_sofa_norja*3X~Dsoft_sofa_norja*4X~Dsoft_sofa_norja*5X~Dsoft_sofa_norja*6X~Dsoft_sofa_norja*7X~Dsoft_sofa_norja*8X~Dsoft_sofa_norja*9X~Dsoft_sofachair_norja*2X~Dsoft_sofachair_norja*3X~Dsoft_sofachair_norja*4X~Dsoft_sofachair_norja*5X~Dsoft_sofachair_norja*6X~Dsoft_sofachair_norja*7X~Dsoft_sofachair_norja*8X~Dsoft_sofachair_norja*9X~Dsofachair_silo*2X~Dsofachair_silo*3X~Dsofachair_silo*4X~Dsofachair_silo*5X~Dsofachair_silo*6X~Dsofachair_silo*7X~Dsofachair_silo*8X~Dsofachair_silo*9X~Dtable_silo_small*2X~Dtable_silo_small*3X~Dtable_silo_small*4X~Dtable_silo_small*5X~Dtable_silo_small*6X~Dtable_silo_small*7X~Dtable_silo_small*8X~Dtable_silo_small*9X~Ddivider_silo1*2X~Ddivider_silo1*3X~Ddivider_silo1*4X~Ddivider_silo1*5X~Ddivider_silo1*6X~Ddivider_silo1*7X~Ddivider_silo1*8X~Ddivider_silo1*9X~Ddivider_silo3*2X~Ddivider_silo3*3X~Ddivider_silo3*4X~Ddivider_silo3*5X~Ddivider_silo3*6X~Ddivider_silo3*7X~Ddivider_silo3*8X~Ddivider_silo3*9X~Dtable_silo_med*2X~Dtable_silo_med*3X~Dtable_silo_med*4X~Dtable_silo_med*5X~Dtable_silo_med*6X~Dtable_silo_med*7X~Dtable_silo_med*8X~Dtable_silo_med*9X~Dsofa_silo*2X~Dsofa_silo*3X~Dsofa_silo*4X~Dsofa_silo*5X~Dsofa_silo*6X~Dsofa_silo*7X~Dsofa_silo*8X~Dsofa_silo*9X~Dsofachair_polyfon*2X~Dsofachair_polyfon*3X~Dsofachair_polyfon*4X~Dsofachair_polyfon*6X~Dsofachair_polyfon*7X~Dsofachair_polyfon*8X~Dsofachair_polyfon*9X~Dsofa_polyfon*2Z[Msofa_polyfon*3Z[Msofa_polyfon*4Z[Msofa_polyfon*6Z[Msofa_polyfon*7Z[Msofa_polyfon*8Z[Msofa_polyfon*9Z[Mbed_polyfon*2X~Dbed_polyfon*3X~Dbed_polyfon*4X~Dbed_polyfon*6X~Dbed_polyfon*7X~Dbed_polyfon*8X~Dbed_polyfon*9X~Dbed_polyfon_one*2[dObed_polyfon_one*3[dObed_polyfon_one*4[dObed_polyfon_one*6[dObed_polyfon_one*7[dObed_polyfon_one*8[dObed_polyfon_one*9[dObardesk_polyfon*2X~Dbardesk_polyfon*3X~Dbardesk_polyfon*4X~Dbardesk_polyfon*5X~Dbardesk_polyfon*6X~Dbardesk_polyfon*7X~Dbardesk_polyfon*8X~Dbardesk_polyfon*9X~Dbardeskcorner_polyfon*2X~Dbardeskcorner_polyfon*3X~Dbardeskcorner_polyfon*4X~Dbardeskcorner_polyfon*5X~Dbardeskcorner_polyfon*6X~Dbardeskcorner_polyfon*7X~Dbardeskcorner_polyfon*8X~Dbardeskcorner_polyfon*9X~Ddivider_poly3*2X~Ddivider_poly3*3X~Ddivider_poly3*4X~Ddivider_poly3*5X~Ddivider_poly3*6X~Ddivider_poly3*7X~Ddivider_poly3*8X~Ddivider_poly3*9X~Dchair_silo*2X~Dchair_silo*3X~Dchair_silo*4X~Dchair_silo*5X~Dchair_silo*6X~Dchair_silo*7X~Dchair_silo*8X~Dchair_silo*9X~Ddivider_nor3*2X~Ddivider_nor3*3X~Ddivider_nor3*4X~Ddivider_nor3*5X~Ddivider_nor3*6X~Ddivider_nor3*7X~Ddivider_nor3*8X~Ddivider_nor3*9X~Ddivider_nor2*2X~Ddivider_nor2*3X~Ddivider_nor2*4X~Ddivider_nor2*5X~Ddivider_nor2*6X~Ddivider_nor2*7X~Ddivider_nor2*8X~Ddivider_nor2*9X~Dsilo_studydeskX~Dsolarium_norjaY_Isolarium_norja*1Y_Isolarium_norja*2Y_Isolarium_norja*3Y_Isolarium_norja*5Y_Isolarium_norja*6Y_Isolarium_norja*7Y_Isolarium_norja*8Y_Isolarium_norja*9Y_IsandrugX~Drare_moonrugYmAchair_chinaYmAchina_tableYmAsleepingbag*1YmAsleepingbag*2YmAsleepingbag*3YmAsleepingbag*4YmAsafe_siloY_Isleepingbag*7YmAsleepingbag*9YmAsleepingbag*5YmAsleepingbag*10YmAsleepingbag*6YmAsleepingbag*8YmAchina_shelveX~Dtraffic_light*5ZxIdivider_nor4*2X~Ddivider_nor4*3X~Ddivider_nor4*5X~Ddivider_nor4*6X~Ddivider_nor4*7X~Ddivider_nor4*8X~Ddivider_nor4*9X~Ddivider_nor5*2X~Ddivider_nor5*3X~Ddivider_nor5*4X~Ddivider_nor5*5X~Ddivider_nor5*6X~Ddivider_nor5*7X~Ddivider_nor5*8X~Ddivider_nor5*9X~Ddivider_nor5X~Ddivider_nor4X~Dwall_chinaYmAcorner_chinaYmAbarchair_silo*2X~Dbarchair_silo*3X~Dbarchair_silo*4X~Dbarchair_silo*5X~Dbarchair_silo*6X~Dbarchair_silo*7X~Dbarchair_silo*8X~Dbarchair_silo*9X~Dsafe_silo*2Y_Isafe_silo*3Y_Isafe_silo*4Y_Isafe_silo*5Y_Isafe_silo*6Y_Isafe_silo*7Y_Isafe_silo*8Y_Isafe_silo*9Y_Iglass_shelfY_Iglass_chairY_Iglass_stoolY_Iglass_sofaY_Iglass_tableY_Iglass_table*2Y_Iglass_table*3Y_Iglass_table*4Y_Iglass_table*5Y_Iglass_table*6Y_Iglass_table*7Y_Iglass_table*8Y_Iglass_table*9Y_Iglass_chair*2Y_Iglass_chair*3Y_Iglass_chair*4Y_Iglass_chair*5Y_Iglass_chair*6Y_Iglass_chair*7Y_Iglass_chair*8Y_Iglass_chair*9Y_Iglass_sofa*2Y_Iglass_sofa*3Y_Iglass_sofa*4Y_Iglass_sofa*5Y_Iglass_sofa*6Y_Iglass_sofa*7Y_Iglass_sofa*8Y_Iglass_sofa*9Y_Iglass_stool*2Y_Iglass_stool*4Y_Iglass_stool*5Y_Iglass_stool*6Y_Iglass_stool*7Y_Iglass_stool*8Y_Iglass_stool*3Y_Iglass_stool*9Y_ICFC_100_coin_goldZvCCFC_10_coin_bronzeZvCCFC_200_moneybagZvCCFC_500_goldbarZvCCFC_50_coin_silverZvCCF_10_coin_goldZvCCF_1_coin_bronzeZvCCF_20_moneybagZvCCF_50_goldbarZvCCF_5_coin_silverZvChc_crptYmAhc_tvZ\BgothgateX~DgothiccandelabraYxBgothrailingX~Dgoth_tableYmAhc_bkshlfYmAhc_btlrY_Ihc_crtnYmAhc_djsetYmAhc_frplcZbBhc_lmpstYmAhc_machineYmAhc_rllrXQHhc_rntgnX~Dhc_trllYmAgothic_chair*1X~Dgothic_sofa*1X~Dgothic_stool*1X~Dgothic_chair*2X~Dgothic_sofa*2X~Dgothic_stool*2X~Dgothic_chair*3X~Dgothic_sofa*3X~Dgothic_stool*3X~Dgothic_chair*4X~Dgothic_sofa*4X~Dgothic_stool*4X~Dgothic_chair*5X~Dgothic_sofa*5X~Dgothic_stool*5X~Dgothic_chair*6X~Dgothic_sofa*6X~Dgothic_stool*6X~Dval_cauldronX~Dsound_machineX~Dromantique_pianochair*3Y_Iromantique_pianochair*5Y_Iromantique_pianochair*2Y_Iromantique_pianochair*4Y_Iromantique_pianochair*1Y_Iromantique_divan*3Y_Iromantique_divan*5Y_Iromantique_divan*2Y_Iromantique_divan*4Y_Iromantique_divan*1Y_Iromantique_chair*3Y_Iromantique_chair*5Y_Iromantique_chair*2Y_Iromantique_chair*4Y_Iromantique_chair*1Y_Irare_parasolY_Iplant_valentinerose*3XICplant_valentinerose*5XICplant_valentinerose*2XICplant_valentinerose*4XICplant_valentinerose*1XICplant_mazegateYeCplant_mazeZcCplant_bulrushXICpetfood4Y_Icarpet_valentineZ|Egothic_carpetXICgothic_carpet2Z|Egothic_chairX~Dgothic_sofaX~Dgothic_stoolX~Dgrand_piano*3Z|Egrand_piano*5Z|Egrand_piano*2Z|Egrand_piano*4Z|Egrand_piano*1Z|Etheatre_seatZ@Kromantique_tray2Y_Iromantique_tray1Y_Iromantique_smalltabl*3Y_Iromantique_smalltabl*5Y_Iromantique_smalltabl*2Y_Iromantique_smalltabl*4Y_Iromantique_smalltabl*1Y_Iromantique_mirrortablY_Iromantique_divider*3Z[Mromantique_divider*2Z[Mromantique_divider*4Z[Mromantique_divider*1Z[Mjp_tatami2YGGjp_tatamiYGGhabbowood_chairYGGjp_bambooYGGjp_iroriXQHjp_pillowYGGsound_set_1Y_Isound_set_2Y_Isound_set_3Y_Isound_set_4Y_Isound_set_5Z@Ksound_set_6Y_Isound_set_7Y_Isound_set_8Y_Isound_set_9Y_Isound_machine*1ZIPspotlightY_Isound_machine*2ZIPsound_machine*3ZIPsound_machine*4ZIPsound_machine*5ZIPsound_machine*6ZIPsound_machine*7ZIProm_lampZ|Erclr_sofaXQHrclr_gardenXQHrclr_chairZ|Esound_set_28Y_Isound_set_27Y_Isound_set_26Y_Isound_set_25Y_Isound_set_24Y_Isound_set_23Y_Isound_set_22Y_Isound_set_21Y_Isound_set_20Z@Ksound_set_19Z@Ksound_set_18Y_Isound_set_17Y_Isound_set_16Y_Isound_set_15Y_Isound_set_14Y_Isound_set_13Y_Isound_set_12Y_Isound_set_11Y_Isound_set_10Y_Irope_dividerXQHromantique_clockY_Irare_icecream_campaignY_Ipura_mdl5*1XQHpura_mdl5*2XQHpura_mdl5*3XQHpura_mdl5*4XQHpura_mdl5*5XQHpura_mdl5*6XQHpura_mdl5*7XQHpura_mdl5*8XQHpura_mdl5*9XQHpura_mdl4*1XQHpura_mdl4*2XQHpura_mdl4*3XQHpura_mdl4*4XQHpura_mdl4*5XQHpura_mdl4*6XQHpura_mdl4*7XQHpura_mdl4*8XQHpura_mdl4*9XQHpura_mdl3*1XQHpura_mdl3*2XQHpura_mdl3*3XQHpura_mdl3*4XQHpura_mdl3*5XQHpura_mdl3*6XQHpura_mdl3*7XQHpura_mdl3*8XQHpura_mdl3*9XQHpura_mdl2*1XQHpura_mdl2*2XQHpura_mdl2*3XQHpura_mdl2*4XQHpura_mdl2*5XQHpura_mdl2*6XQHpura_mdl2*7XQHpura_mdl2*8XQHpura_mdl2*9XQHpura_mdl1*1XQHpura_mdl1*2XQHpura_mdl1*3XQHpura_mdl1*4XQHpura_mdl1*5XQHpura_mdl1*6XQHpura_mdl1*7XQHpura_mdl1*8XQHpura_mdl1*9XQHjp_lanternXQHchair_basic*1XQHchair_basic*2XQHchair_basic*3XQHchair_basic*4XQHchair_basic*5XQHchair_basic*6XQHchair_basic*7XQHchair_basic*8XQHchair_basic*9XQHbed_budget*1XQHbed_budget*2XQHbed_budget*3XQHbed_budget*4XQHbed_budget*5XQHbed_budget*6XQHbed_budget*7XQHbed_budget*8XQHbed_budget*9XQHbed_budget_one*1XQHbed_budget_one*2XQHbed_budget_one*3XQHbed_budget_one*4XQHbed_budget_one*5XQHbed_budget_one*6XQHbed_budget_one*7XQHbed_budget_one*8XQHbed_budget_one*9XQHjp_drawerXQHtile_stellaZ[Mtile_marbleZ[Mtile_brownZ[Msummer_grill*1Y_Isummer_grill*2Y_Isummer_grill*3Y_Isummer_grill*4Y_Isummer_chair*1Y_Isummer_chair*2Y_Isummer_chair*3Y_Isummer_chair*4Y_Isummer_chair*5Y_Isummer_chair*6Y_Isummer_chair*7Y_Isummer_chair*8Y_Isummer_chair*9Y_Isound_set_36ZfIsound_set_35ZfIsound_set_34ZfIsound_set_33ZfIsound_set_32Y_Isound_set_31Y_Isound_set_30Y_Isound_set_29Y_Isound_machine_pro[~Nrare_mnstrY_Ione_way_door*1XQHone_way_door*2XQHone_way_door*3XQHone_way_door*4XQHone_way_door*5XQHone_way_door*6XQHone_way_door*7XQHone_way_door*8XQHone_way_door*9XQHexe_rugZ[Mexe_s_tableZGRsound_set_37ZfIsummer_pool*1ZlIsummer_pool*2ZlIsummer_pool*3ZlIsummer_pool*4ZlIsong_diskY_Ijukebox*1[~Ncarpet_soft_tut[~Nsound_set_44Z@Ksound_set_43Z@Ksound_set_42Z@Ksound_set_41Z@Ksound_set_40Z@Ksound_set_39Z@Ksound_set_38Z@Kgrunge_chairZ@Kgrunge_mattressZ@Kgrunge_radiatorZ@Kgrunge_shelfZ@Kgrunge_signZ@Kgrunge_tableZ@Khabboween_crypt[uKhabboween_grassZ@Khal_cauldronZ@Khal_graveZ@Ksound_set_52ZuKsound_set_51ZuKsound_set_50ZuKsound_set_49ZuKsound_set_48ZuKsound_set_47ZuKsound_set_46ZuKsound_set_45ZuKxmas_icelampZ[Mxmas_cstl_wallZ[Mxmas_cstl_twrZ[Mxmas_cstl_gate[~Ntree7Z[Mtree6Z[Msound_set_54Z[Msound_set_53Z[Msafe_silo_pb[dOplant_mazegate_snowZ[Mplant_maze_snowZ[Mchristmas_sleighZ[Mchristmas_reindeer[~Nchristmas_poopZ[Mexe_bardeskZ[Mexe_chairZ[Mexe_chair2Z[Mexe_cornerZ[Mexe_drinksZ[Mexe_sofaZ[Mexe_tableZ[Msound_set_59[~Nsound_set_58[~Nsound_set_57[~Nsound_set_56[~Nsound_set_55[~Nnoob_table*1[~Nnoob_table*2[~Nnoob_table*3[~Nnoob_table*4[~Nnoob_table*5[~Nnoob_table*6[~Nnoob_stool*1[~Nnoob_stool*2[~Nnoob_stool*3[~Nnoob_stool*4[~Nnoob_stool*5[~Nnoob_stool*6[~Nnoob_rug*1[~Nnoob_rug*2[~Nnoob_rug*3[~Nnoob_rug*4[~Nnoob_rug*5[~Nnoob_rug*6[~Nnoob_lamp*1[dOnoob_lamp*2[dOnoob_lamp*3[dOnoob_lamp*4[dOnoob_lamp*5[dOnoob_lamp*6[dOnoob_chair*1[~Nnoob_chair*2[~Nnoob_chair*3[~Nnoob_chair*4[~Nnoob_chair*5[~Nnoob_chair*6[~Nexe_globe[~Nexe_plantZ[Mval_teddy*1[dOval_teddy*2[dOval_teddy*3[dOval_teddy*4[dOval_teddy*5[dOval_teddy*6[dOval_randomizer[dOval_choco[dOteleport_door[dOsound_set_61[dOsound_set_60[dOfortune[dOsw_tableZIPsw_raven[cQsw_chestZIPsand_cstl_wallZIPsand_cstl_twrZIPsand_cstl_gateZIPgrunge_candleZIPgrunge_benchZIPgrunge_barrelZIPrclr_lampZGRprizetrophy9*1ZGRprizetrophy8*1ZGRnouvelle_traxYcPmd_rugZGRjp_tray6ZGRjp_tray5ZGRjp_tray4ZGRjp_tray3ZGRjp_tray2ZGRjp_tray1ZGRarabian_teamkZGRarabian_snakeZGRarabian_rugZGRarabian_pllwZGRarabian_divdrZGRarabian_chairZGRarabian_bigtbZGRarabian_tetblZGRarabian_tray1ZGRarabian_tray2ZGRarabian_tray3ZGRarabian_tray4ZGRPIpost.itHpost.it.vdHphotoHChessHTicTacToeHBattleShipHPokerHwallpaperHfloorHposterZ@KgothicfountainYxBhc_wall_lampZbBindustrialfanZ`BtorchZ\Bval_heartXBCwallmirrorZ|Ejp_ninjastarsXQHhabw_mirrorXQHhabbowheelZ[Mguitar_skullZ@Kguitar_vZ@Kxmas_light[~Nhrella_poster_3[Nhrella_poster_2ZIPhrella_poster_1[Nsw_swordsZIPsw_stoneZIPsw_holeZIProomdimmerZGRmd_logo_wallZGRmd_canZGRjp_sheet3ZGRjp_sheet2ZGRjp_sheet1ZGRarabian_swordsZGRarabian_wndwZGR"); _receivedSpriteIndex = true; } } break; } case "Cf": // "GET_GROUP_BADGES" { Response.Initalize(309); // "Du": [[#room_handler, #handle_group_badges]] Response.Append(Room.Groups); SendResponse(); break; } case "@": // Enter room - guestroom - get wallitems { if (_ROOMACCESS_SECONDARY_OK && Room != null) sendData("@m" + Room.Wallitems); break; } case "A@": // Enter room - add this user to room { if (_ROOMACCESS_SECONDARY_OK && Room != null && roomUser == null) { sendData("@b" + Room.dynamicStatuses); Room.addUser(this); } break; } #endregion #region MOD-Tool case "CH": // MOD-Tool { int header1 = Request.PopWiredInt(); int header2 = Request.PopWiredInt(); switch (currentPacket.Substring(0,2)) // Select the action { #region Alert single user case "HH": // Alert single user { if (rankManager.containsRight(_Rank, "fuse_alert") == false) { sendData("BK" + stringManager.getString("modtool_accesserror")); return; } string Message = Request.PopString(); string Note = Request.PopString(); string Target = Request.PopString(); if (Message == "" || Target == "") return; virtualUser _targetUser = userManager.getUser(Target); if (_targetUser == null) sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_usernotfound")); else { _targetUser.sendData("B!" + Message + Convert.ToChar(2)); staffManager.addStaffMessage("alert", userID, _targetUser.userID, Message, Note); } break; } #endregion #region Kick single user from room case "HI": // Kick single user from room { if (rankManager.containsRight(_Rank, "fuse_kick") == false) { sendData("BK" + stringManager.getString("modtool_accesserror")); return; } string Message = Request.PopString(); string Note = Request.PopString(); string Target = Request.PopString(); if (Message == "" || Target == "") return; virtualUser _targetUser = userManager.getUser(Target); if (_targetUser == null) sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_usernotfound")); else { if (_targetUser.Room != null && _targetUser.roomUser != null) { if (_targetUser._Rank < _Rank) { _targetUser.Room.removeUser(_targetUser.roomUser.roomUID, true, Message); staffManager.addStaffMessage("kick", userID, _targetUser.userID, Message, Note); } else sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_rankerror")); } } break; } #endregion #region Ban single user case "HJ": // Ban single user / IP { if (rankManager.containsRight(_Rank, "fuse_ban") == false) { sendData("BK" + stringManager.getString("modtool_accesserror")); return; } string Message = Request.PopString(); string Note = Request.PopString(); string Target = Request.PopString(); int banPeriod = Request.PopWiredInt(); // In hours bool banIP = Request.PopWiredBoolean(); bool banPC = Request.PopWiredBoolean(); if (Message == "" || Target == "" || banPeriod == 0) return; DataRow row; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("name", Target); row = dbClient.ReadDataRow("SELECT * FROM users WHERE name = @name"); } if (row == null) { sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_usernotfound")); return; } if (Convert.ToByte(row["rank"]) >= _Rank) { sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_rankerror")); return; } staffManager.addStaffMessage("ban", userID, Convert.ToInt32(row["id"]), Message, Note); if ((banIP || banPC) && rankManager.containsRight(_Rank, "fuse_superban")) // IP ban is chosen and allowed for this staff member { userManager.setBan(Convert.ToInt32(row["id"]), banPeriod, Message); } else { userManager.setBan(Convert.ToInt32(row["id"]), banPeriod, Message); } sendData("BK" + userManager.generateBanReport(Convert.ToInt32(row["id"]))); break; } #endregion #region Room alert case "IH": // Alert all users in current room { if (rankManager.containsRight(_Rank, "fuse_room_alert") == false) { sendData("BK" + stringManager.getString("modtool_accesserror")); return; } if (Room == null || roomUser == null) { return; } int messageLength = Encoding.decodeB64(currentPacket.Substring(4, 2)); string Message = currentPacket.Substring(6, messageLength); int staffNoteLength = Encoding.decodeB64(currentPacket.Substring(messageLength + 6, 2)); string staffNote = currentPacket.Substring(messageLength + 8, staffNoteLength); if (Message != "") { Room.sendData("B!" + Message + Convert.ToChar(2)); staffManager.addStaffMessage("ralert", userID, _roomID, Message, staffNote); } break; } #endregion #region Room kick case "II": // Kick all users below users rank from room { if (rankManager.containsRight(_Rank, "fuse_room_kick") == false) { sendData("BK" + stringManager.getString("modtool_accesserror")); return; } if (Room == null || roomUser == null) { return; } int messageLength = Encoding.decodeB64(currentPacket.Substring(4, 2)); string Message = currentPacket.Substring(6, messageLength); int staffNoteLength = Encoding.decodeB64(currentPacket.Substring(messageLength + 6, 2)); string staffNote = currentPacket.Substring(messageLength + 8, staffNoteLength); if (Message != "") { Room.kickUsers(_Rank, Message); staffManager.addStaffMessage("rkick", userID, _roomID, Message, staffNote); } break; } #endregion } break; } #endregion #region Cry For Help #region User Side case "Cm": // User wants to send a CFH message - "Cm" { Response.Initalize(319); // "D" cfhMessage message = staffManager.getMessage(_Username); if (message != null) { Response.AppendBoolean(true); Response.AppendString(message.ID); Response.AppendString(message.Sent); Response.AppendString(message.Message); } else Response.AppendWired(0); SendResponse(); break; } case "Cn": // User deletes his pending CFH message - "Cn" { cfhMessage CFH = staffManager.getMessage(_Username); if (CFH != null) staffManager.deleteMessage(CFH.ID); Response.Initalize(320); // "E@": [[#dialogs_handler, #handle_pending_CFHs_deleted]] SendResponse(); break; } case "AV": // User sends CFH message - "AV" { if (Room != null && roomUser != null && staffManager.getMessage(_Username) == null) { string cfhMessage = Request.PopString(); staffManager.addMessage(_Username, connectionRemoteIP, cfhMessage, _roomID, Room.name); Response.Initalize(321); // "EA": [[#dialogs_handler, #handle_cfh_sending_response]] Response.AppendWired(0); SendResponse(); FuseBuilder Message = new FuseBuilder(148); // "BT": [[#hobba_handler, #handle_cryforhelp]] Message.Append(staffManager.getMessage(_Username).ToFuseString()); userManager.sendToRank(4, true, Message.ToString()); } break; } #endregion #region Staff Side case "CG": // CFH center - reply call - "CG" { if (!rankManager.containsRight(_Rank, "fuse_receive_calls_for_help")) return; int cfhID = Encoding.decodeVL64(Request.PopString()); string cfhReply = Request.PopString(); staffManager.sendReply(cfhID, cfhReply); break; } case "CF": // CFH center - Delete (Downgrade) - "CF" { if (!rankManager.containsRight(_Rank, "fuse_receive_calls_for_help")) return; int cfhID = Encoding.decodeVL64(Request.PopString()); cfhMessage CFH = staffManager.getMessage(cfhID); if (CFH != null) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("username", CFH.Username); dbClient.AddParamWithValue("ip", CFH.IP); dbClient.AddParamWithValue("message", CFH.Message); dbClient.AddParamWithValue("date", CFH.Sent); dbClient.AddParamWithValue("roomid", CFH.RoomID); dbClient.ExecuteQuery("INSERT INTO cms_help (username,ip,message,date,picked_up,subject,roomid) VALUES (@username,@ip,@message,@date,'0','CFH message [hotel]',@roomid)"); } staffManager.deleteMessage(cfhID); } break; } case "@p": // CFH center - Pickup - "@p" { int cfhID = Encoding.decodeVL64(Request.PopString()); cfhMessage CFH = staffManager.getMessage(cfhID); if (CFH == null) { sendData("BK" + stringManager.getString("cfh_deleted")); return; } staffManager.pickupMessage(cfhID); FuseBuilder Message = new FuseBuilder(149); // "BU": [[#hobba_handler, #handle_picked_cry]] Message.AppendWired(CFH.ID); Message.AppendChar(2); Message.AppendString(_Username); userManager.sendToRank(4, true, Message.ToString()); break; } case "EC": // Go to the room that the call for help was sent from - "EC" { if (!rankManager.containsRight(_Rank, "fuse_receive_calls_for_help")) return; int cfhID = Encoding.decodeVL64(Request.PopString()); cfhMessage CFH = staffManager.getMessage(cfhID); if (CFH != null) { virtualRoom room = roomManager.getRoom(CFH.RoomID); if (room != null) { Response.Initalize(286); // "D^" Response.AppendBoolean(room.isPublicroom); Response.AppendWired(room.roomID); SendResponse(); } } break; } #endregion #endregion #region In-room actions case "AO": // Room - rotate user { if (Room != null && roomUser != null && statusManager.containsStatus("sit") == false && statusManager.containsStatus("lay") == false) { int X = int.Parse(currentPacket.Substring(2).Split(' ')[0]); int Y = int.Parse(currentPacket.Split(' ')[1]); roomUser.Z1 = Rooms.Pathfinding.Rotation.Calculate(roomUser.X, roomUser.Y, X, Y); roomUser.Z2 = roomUser.Z1; roomUser.Refresh(); } break; } case "AK": // Room - walk to a new square { if (Room != null && roomUser != null && roomUser.walkLock == false) { int goalX = Encoding.decodeB64(currentPacket.Substring(2, 2)); int goalY = Encoding.decodeB64(currentPacket.Substring(4, 2)); if (roomUser.SPECIAL_TELEPORTABLE) { roomUser.X = goalX; roomUser.Y = goalY; roomUser.goalX = -1; Room.Refresh(roomUser); refreshAppearance(false, false, true); } else { roomUser.goalX = goalX; roomUser.goalY = goalY; } } break; } case "As": // Room - click door to exit room { if (Room != null && roomUser != null && roomUser.walkDoor == false) { roomUser.walkDoor = true; roomUser.goalX = Room.doorX; roomUser.goalY = Room.doorY; } break; } case "At": // Room - select swimming outfit { if (Room != null || roomUser != null && Room.hasSwimmingPool) { virtualRoom.squareTrigger Trigger = Room.getTrigger(roomUser.X, roomUser.Y); if (Trigger.Object == "curtains1" || Trigger.Object == "curtains2") { string Outfit = Request.Content; roomUser.SwimOutfit = Outfit; Room.sendData(@"@\" + roomUser.detailsString); Room.sendSpecialCast(Trigger.Object, "open"); roomUser.walkLock = false; roomUser.goalX = Trigger.goalX; roomUser.goalY = Trigger.goalY; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("figure", Outfit); dbClient.AddParamWithValue("userid", userID); dbClient.ExecuteQuery("UPDATE users SET figure_swim = @figure WHERE id = @userid LIMIT 1"); } } } break; } case "B^": // Badges - switch or toggle on/off badge { if (Room != null && roomUser != null) { int enabledBadges = 0; // Reset slots using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) dbClient.ExecuteQuery("UPDATE users_badges SET slotid = '0' WHERE userid = '" + this.userID + "'"); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) for (int i = 0; i < 5; i++) // 5 badge slots { int slotID = Request.PopWiredInt(); string badgeID = Request.PopString(); if (badgeID != "") { dbClient.AddParamWithValue("@badgeid", badgeID); dbClient.AddParamWithValue("@slotid", slotID); dbClient.AddParamWithValue("@userid", userID); dbClient.ExecuteQuery("UPDATE users_badges SET slotid = @slotid WHERE userid = @userid AND badgeid = @badgeid"); enabledBadges++; } } refreshBadges(); FuseBuilder Message = new FuseBuilder(228); // "Cd" Message.AppendString(userID); Message.AppendWired(enabledBadges); foreach (userBadge badge in Badges) if (badge.slotID > 0) // Badge enabled { Message.AppendWired(badge.slotID); Message.AppendString(badge.badgeID); } Room.sendData(Message); } break; } case "DG": // Tags - get tags { int ownerID = Request.PopWiredInt(); Response.Initalize(350); // "E^" Response.AppendWired(ownerID); DataTable table; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) table = dbClient.ReadDataTable("SELECT tag FROM cms_tags WHERE ownerid = '" + ownerID + "'"); Response.AppendWired(table.Rows.Count); foreach (DataRow row in table.Rows) Response.AppendString(row[0]); SendResponse(); break; } case "Cg": // Group badges - get details about a group [click badge] { if (Room != null && roomUser != null) { int groupID = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (dbClient.Exists("SELECT id FROM groups_details WHERE id = '" + groupID + "'")) { // TODO: Read row instead string Name = dbClient.ReadString("SELECT name FROM groups_details WHERE id = '" + groupID + "'"); string Description = dbClient.ReadString("SELECT description FROM groups_details WHERE id = '" + groupID + "'"); int roomID = dbClient.ReadInt32("SELECT roomid FROM groups_details WHERE id = '" + groupID + "'"); string roomName = ""; if (roomID > 0) roomName = dbClient.ReadString("SELECT name FROM rooms WHERE id = '" + roomID + "'"); else roomID = -1; Response.Initalize(311); // "Dw" Response.AppendWired(groupID); Response.AppendString(Name); Response.AppendString(Description); Response.AppendWired(roomID); Response.AppendString(roomName); SendResponse(); } } break; } case "AX": // Statuses - stop status { if (statusManager != null) { string Status = currentPacket.Substring(2); if (Status == "CarryItem") statusManager.dropCarrydItem(); else if (Status == "Dance") { statusManager.removeStatus("dance"); statusManager.Refresh(); } } break; } case "A^": // Statuses - wave { if (Room != null && roomUser != null && statusManager.containsStatus("wave") == false) { statusManager.removeStatus("dance"); statusManager.handleStatus("wave", "", Config.Statuses_Wave_waveDuration); } break; } case "A]": // Statuses - dance { if (Room != null && roomUser != null && statusManager.containsStatus("sit") == false && statusManager.containsStatus("lay") == false) { statusManager.dropCarrydItem(); if (currentPacket.Length == 2) statusManager.addStatus("dance", ""); else { if (rankManager.containsRight(_Rank, "fuse_use_club_dance") == false) { return; } int danceID = Encoding.decodeVL64(currentPacket.Substring(2)); if (danceID < 0 || danceID > 4) { return; } statusManager.addStatus("dance", danceID.ToString()); } statusManager.Refresh(); } break; } case "AP": // Statuses - carry item { if (Room != null && roomUser != null) { string Item = currentPacket.Substring(2); if (statusManager.containsStatus("lay") || Item.Contains("/")) return; // THE HAX! \o/ try { int nItem = int.Parse(Item); if (nItem < 1 || nItem > 26) return; } catch { if (_inPublicroom == false && Item != "Water" && Item != "Milk" && Item != "Juice") // Not a drink that can be retrieved from the infobus minibar return; } statusManager.carryItem(Item); } break; } #region Chat case "@t": // Chat - say case "@w": // Chat - shout { if (_isMuted == false && Room != null && roomUser != null) { string Message = Request.PopString(); if (isSpeechCommand(Message.Substring(1))) // Speechcommand invoked! { if (roomUser.isTyping) { Room.sendData("Ei" + Encoding.encodeVL64(roomUser.roomUID) + "H"); roomUser.isTyping = false; } } else { userManager.addChatMessage(_Username, _roomID, Message); Message = stringManager.filterSwearwords(Message); if (currentPacket.Substring(1, 1) == "w") // Shout Room.sendShout(roomUser, Message); else Room.sendSaying(roomUser, Message); } } break; } case "@x": // Chat - whisper { // * muted if (_isMuted == false && Room != null && roomUser != null) { string Receiver = currentPacket.Substring(4).Split(' ')[0]; string Message = currentPacket.Substring(Receiver.Length + 5); if (isSpeechCommand(Message.Substring(1))) // Speechcommand invoked! { if (roomUser.isTyping) { Room.sendData("Ei" + Encoding.encodeVL64(roomUser.roomUID) + "H"); roomUser.isTyping = false; } } else { userManager.addChatMessage(_Username, _roomID, Message); Message = stringManager.filterSwearwords(Message); Room.sendWhisper(roomUser, Receiver, Message); } } break; } case "D}": // Chat - show speech bubble { if (_isMuted == false && Room != null && roomUser != null) { Room.sendData("Ei" + Encoding.encodeVL64(roomUser.roomUID) + "I"); roomUser.isTyping = true; } break; } case "D~": // Chat - hide speech bubble { if (Room != null && roomUser != null) { Room.sendData("Ei" + Encoding.encodeVL64(roomUser.roomUID) + "H"); roomUser.isTyping = false; } break; } #endregion #region Guestroom - rights, kicking, roombans and room voting case "A`": // Give rights { if (Room == null || roomUser == null || _inPublicroom || _isOwner == false) return; string Target = currentPacket.Substring(2); if (userManager.containsUser(Target) == false) return; virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID || _Target._hasRights || _Target._isOwner || _Target.roomUser == null || _Target.Room == null) return; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("INSERT INTO room_rights(roomid,userid) VALUES ('" + _roomID + "','" + _Target.userID + "')"); _Target._hasRights = true; _Target.statusManager.addStatus("flatctrl", "onlyfurniture"); _Target.roomUser.Refresh(); _Target.sendData("@j"); break; } case "Aa": // Take rights { if (Room == null || roomUser == null || _inPublicroom || _isOwner == false) return; string Target = currentPacket.Substring(2); if (userManager.containsUser(Target) == false) return; virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID || _Target._hasRights == false || _Target._isOwner || _Target.roomUser == null || _Target.Room == null) return; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("DELETE FROM room_rights WHERE roomid = '" + _roomID + "' AND userid = '" + _Target.userID + "' LIMIT 1"); _Target._hasRights = false; _Target.statusManager.removeStatus("flatctrl"); _Target.roomUser.Refresh(); _Target.sendData("@k"); break; } case "A_": // Kick user { if (Room == null || roomUser == null || _inPublicroom || _hasRights == false) return; string Target = currentPacket.Substring(2); if (userManager.containsUser(Target) == false) return; virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID) return; if (_Target._isOwner && (_Target._Rank > _Rank || rankManager.containsRight(_Target._Rank, "fuse_any_room_controller")) || _Target.roomUser == null || _Target.Room == null) return; _Target.roomUser.walkLock = true; _Target.roomUser.walkDoor = true; _Target.roomUser.goalX = Room.doorX; _Target.roomUser.goalY = Room.doorY; break; } case "E@": // Kick and apply roomban { if (_hasRights == false || _inPublicroom || Room == null || roomUser == null) return; string Target = currentPacket.Substring(2); if (userManager.containsUser(Target) == false) return; virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID) return; if (_Target._isOwner && (_Target._Rank > _Rank || rankManager.containsRight(_Target._Rank, "fuse_any_room_controller")) || _Target.roomUser == null || _Target.Room == null) return; string banExpireMoment = DateTime.Now.AddMinutes(Config.Rooms_roomBan_banDuration).ToString(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("INSERT INTO room_bans (roomid,userid,ban_expire) VALUES ('" + _roomID + "','" + _Target.userID + "','" + banExpireMoment + "')"); _Target.roomUser.walkLock = true; _Target.roomUser.walkDoor = true; _Target.roomUser.goalX = Room.doorX; _Target.roomUser.goalY = Room.doorY; break; } case "Ab": // Answer guestroom doorbell { break; } case "DE": // Vote -1 or +1 on room { if (_inPublicroom || Room == null || roomUser == null || roomUser.hasVoted) return; int Vote = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if ((Vote == 1 || Vote == -1) && dbClient.Exists("SELECT userid FROM room_votes WHERE userid = '" + userID + "' AND roomid = '" + _roomID + "'") == false) { dbClient.ExecuteQuery("INSERT INTO room_votes (userid,roomid,vote) VALUES ('" + userID + "','" + _roomID + "','" + Vote + "')"); int voteAmount = dbClient.ReadInt32("SELECT SUM(vote) FROM room_votes WHERE roomid = '" + _roomID + "'"); if (voteAmount < 0) voteAmount = 0; roomUser.hasVoted = true; Room.sendNewVoteAmount(voteAmount); } break; } #endregion #region Catalogue and Recycler case "Ae": // Catalogue - open, retrieve index of pages { if (Room != null && roomUser != null) { Response.Initalize(126); // "A~" foreach (cataloguePage page in catalogueManager.getPages()) { if (page.MinRank <= _Rank) { Response.AppendString(page.IndexName, 9); Response.AppendString(page.DisplayName, 13); } } SendResponse(); } break; } case "Af": // Catalogue, open page, get page content { if (Room != null && roomUser != null) { string pageIndexName = currentPacket.Split('/')[1]; cataloguePage page = catalogueManager.getPage(pageIndexName); if (page.MinRank <= _Rank) { Response.Initalize(127); // "A" Response.Append(page.ToFuseString()); SendResponse(); } } break; } case "Ad": // Catalogue - purchase { string[] packetContent = currentPacket.Split(Convert.ToChar(13)); string Page = packetContent[1]; string Item = packetContent[3]; cataloguePage page = catalogueManager.getPage(Page); catalogueProduct product = catalogueManager.getProduct(Item, page.IndexID); if(page != null && product != null) { if (page.MinRank > _Rank) return; // TODO: Blacklist IP? itemTemplate template = catalogueManager.getItem(product.mTemplateID); int receiverID = userID; int presentBoxID = 0; int roomID = 0; // -1 = present box, 0 = inhand if (product.mCost > _Credits) { Response.Initalize(68); // "AD" SendResponse(); return; } #region Present if (packetContent[5] == "1") // Purchased as present { string receiverName = packetContent[6]; if (receiverName != _Username) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("reciver", receiverName); receiverID = dbClient.ReadInt32("SELECT id FROM users WHERE name = @reciver"); if (receiverID == 0) { Response.Initalize(76); // "AL" Response.Append(receiverName); SendResponse(); return; } } } itemTemplate present = catalogueManager.generatePresent(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("tid", present.ID); dbClient.AddParamWithValue("reciver", receiverID); dbClient.AddParamWithValue("var", "!" + stringManager.filterSwearwords(packetContent[7])); dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,var) VALUES (@tid,@reciver,@var)"); } presentBoxID = catalogueManager.lastItemID; roomID = -1; } #endregion #region Update credits _Credits -= product.mCost; Response.Initalize(6); // "@F" Response.Append(_Credits); SendResponse(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("credits", _Credits); dbClient.AddParamWithValue("userid", userID); dbClient.ExecuteQuery("UPDATE users SET credits = @credits WHERE id = @userid"); } #endregion #region Deal if (stringManager.getStringPart(Item, 0, 4) == "deal") { List deals = catalogueManager.getDeals(product.mID); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) foreach (catalogueDeal deal in deals) { for (int i = 0; i < deal.mItemCount; i++) { dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,roomid) VALUES ('" + deal.mTemplateID + "','" + receiverID + "','" + roomID + "')"); catalogueManager.handlePurchase(deal.mTemplateID, receiverID, roomID, 0, presentBoxID); } } } #endregion else { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("tid", product.mTemplateID); dbClient.AddParamWithValue("reciver", receiverID); dbClient.AddParamWithValue("roomid", roomID); dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,roomid) VALUES (@tid,@reciver,@roomid)"); } if (template.posterString != null && (template.posterString[0] == "wallpaper" || template.posterString[0] == "landscape") || template.Sprite == "floor") { double decorID = double.Parse(packetContent[4].Replace('.', ',')); catalogueManager.handlePurchase(template.ID, receiverID, 0, decorID, presentBoxID); } else if (stringManager.getStringPart(template.Sprite, 0, 11) == "prizetrophy") { string itemVariable = _Username + "\t" + DateTime.Today.ToShortDateString() + "\t" + packetContent[4]; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("var", itemVariable); dbClient.AddParamWithValue("id", catalogueManager.lastItemID); dbClient.ExecuteQuery("UPDATE furniture SET var = @var WHERE id = @id"); } } else catalogueManager.handlePurchase(template.ID, receiverID, roomID, 0, presentBoxID); } if (Room != null && roomUser != null && _inPublicroom == false) { if (receiverID == userID) refreshHand("last"); else if (userManager.containsUser(receiverID)) { userManager.getUser(receiverID).refreshHand("last"); } } } break; } case "Ca": // Recycler - proceed input items { if (Config.enableRecycler == false || Room == null || recyclerManager.sessionExists(userID)) return; int itemCount = Request.PopWiredInt(); if (recyclerManager.rewardExists(itemCount)) { recyclerManager.createSession(userID, itemCount); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) for (int i = 0; i < itemCount; i++) { int itemID = Request.PopWiredInt(); if (dbClient.Exists("SELECT id FROM furniture WHERE ownerid = '" + userID + "' AND roomid = '0'")) { dbClient.ExecuteQuery("UPDATE furniture SET roomid = '-2' WHERE id = '" + itemID + "' LIMIT 1"); } else { recyclerManager.dropSession(userID, true); sendData("DpH"); return; } } sendData("Dp" + recyclerManager.sessionString(userID)); refreshHand("update"); } break; } case "Cb": // Recycler - redeem/cancel session { if (Config.enableRecycler == false || Room != null && recyclerManager.sessionExists(userID)) { bool Redeem = (currentPacket.Substring(2) == "I"); if (Redeem && recyclerManager.sessionReady(userID)) recyclerManager.rewardSession(userID); recyclerManager.dropSession(userID, Redeem); sendData("Dp" + recyclerManager.sessionString(userID)); if (Redeem) refreshHand("last"); else refreshHand("new"); } break; } #endregion #region Hand and item handling case "AA": // Hand { if (_inPublicroom || Room == null || roomUser == null) return; refreshHand(Request.Content); break; } case "AB": // Item handling - apply wallpaper/floor to room { if (_hasRights == false || _inPublicroom || Room == null || roomUser == null) return; DataRow row; int itemID = int.Parse(currentPacket.Split('/')[1]); string decorType = currentPacket.Substring(2).Split('/')[0]; if (decorType != "wallpaper" && decorType != "floor" && decorType != "landscape") return; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) row = dbClient.ReadDataRow("SELECT tid,var FROM furniture WHERE id = '" + itemID + "' AND ownerid = '" + userID + "' AND roomid = '0'"); itemTemplate template = catalogueManager.getItem(Convert.ToInt32(row[0])); if (template.Sprite != decorType && template.posterString[0] != decorType) return; FuseBuilder Message = new FuseBuilder(46); // "@n" Message.Append(decorType); Message.Append("/"); Message.Append(row[1].ToString().Replace(',', '.')); Room.sendData(Message); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.ExecuteQuery("UPDATE rooms SET " + decorType + " = '" + row[1].ToString().Replace(',', '.') + "' WHERE id = '" + _roomID + "'"); dbClient.ExecuteQuery("DELETE FROM furniture WHERE id = '" + itemID + "'"); } break; } case "AZ": // Item handling - place item down { if (_hasRights == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = int.Parse(currentPacket.Split(' ')[0].Substring(2)); DataRow row; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("itemid", itemID); dbClient.AddParamWithValue("userid", userID); row = dbClient.ReadDataRow("SELECT tid,var FROM furniture WHERE id = @itemid AND ownerid = @userid AND roomid = '0'"); } if (row == null) return; itemTemplate template = catalogueManager.getItem(Convert.ToInt32(row[0])); if (template.TypeID == 0) { string _INPUTPOS = currentPacket.Substring(itemID.ToString().Length + 3); string _CHECKEDPOS = catalogueManager.wallPositionOK(_INPUTPOS); if (_CHECKEDPOS != _INPUTPOS) return; if (stringManager.getStringPart(template.Sprite, 0, 7) == "post.it") { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { if (Convert.ToInt32(row[1]) > 1) dbClient.ExecuteQuery("UPDATE furniture SET var = var - 1 WHERE id = '" + itemID + "' LIMIT 1"); else dbClient.ExecuteQuery("DELETE FROM furniture WHERE id = '" + itemID + "' LIMIT 1"); dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,var) VALUES ('" + template.ID + "','" + userID + "','FFFF33')"); itemID = catalogueManager.lastItemID; dbClient.ExecuteQuery("INSERT INTO furniture_stickies(id) VALUES ('" + itemID + "')"); Room.wallItemManager.addItem(itemID, template.ID, _CHECKEDPOS, "FFFF33", true); break; } } Room.wallItemManager.addItem(itemID, template.ID, _CHECKEDPOS, row[1].ToString(), true); } else { if ((template.SoundMachine || template.Jukebox) && Room.floorItemManager.soundMachineID > 0) { sendData("BK" + "You can't have more than 1 jukebox or trax in the room!"); return; } string[] locDetails = currentPacket.Split(' '); int X = int.Parse(locDetails[1]); int Y = int.Parse(locDetails[2]); byte Z = byte.Parse(locDetails[3]); byte TypeID = catalogueManager.getItem(template.ID).TypeID; Room.floorItemManager.placeItem(itemID, template.ID, X, Y, TypeID, Z); } break; } case "AC": // Item handling - pickup item { if (_isOwner == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = int.Parse(currentPacket.Split(' ')[2]); if (Room.floorItemManager.containsItem(itemID)) Room.floorItemManager.removeItem(itemID, userID); else if (Room.wallItemManager.containsItem(itemID) && stringManager.getStringPart(Room.wallItemManager.getItem(itemID).Sprite, 0, 7) != "post.it") // Can't pickup stickies from room Room.wallItemManager.removeItem(itemID, userID); else return; refreshHand("update"); break; } case "AI": // Item handling - move/rotate item { if (_hasRights == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = int.Parse(currentPacket.Split(' ')[0].Substring(2)); if (Room.floorItemManager.containsItem(itemID)) { string[] locDetails = currentPacket.Split(' '); int X = int.Parse(locDetails[1]); int Y = int.Parse(locDetails[2]); byte Z = byte.Parse(locDetails[3]); Room.floorItemManager.relocateItem(itemID, X, Y, Z); } break; } case "CV": // Item handling - toggle wallitem status { if (_inPublicroom || Room == null || roomUser == null) return; int itemID = int.Parse(Request.PopString()); int toStatus = Request.PopWiredInt(); Room.wallItemManager.toggleItemStatus(itemID, toStatus); break; } case "AJ": // Item handling - toggle flooritem status { try { int itemID = int.Parse(Request.PopString()); string toStatus = Request.PopString(); Room.floorItemManager.toggleItemStatus(itemID, toStatus, _hasRights); } catch { } break; } case "AN": // Item handling - open presentbox { if (_isOwner == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = int.Parse(currentPacket.Substring(2)); if (Room.floorItemManager.containsItem(itemID) == false) return; int TID = 0; DataColumn column; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("itemid", itemID); column = dbClient.ReadDataColumn("SELECT itemid FROM furniture_presents WHERE id = @itemid"); foreach (DataRow row in column.Table.Rows) { dbClient.AddParamWithValue("id", row[0]); dbClient.ExecuteQuery("UPDATE furniture SET roomid = '0' WHERE id = @id"); TID = dbClient.ReadInt32("SELECT tid FROM furniture WHERE id = @id"); } } itemTemplate template = catalogueManager.getItem(TID); Response.Initalize(129); // "BA" Response.AppendString(template.Sprite, 13); Response.Append(template.Sprite); if (template.TypeID == 0) { Response.Append(" "); Response.AppendString(template.Colour, 13); } else { Response.AppendChar(13); Response.AppendString(template.Length, 30); Response.AppendString(template.Width, 30); Response.Append(template.Colour); } using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("itemid", itemID); dbClient.ExecuteQuery("DELETE FROM furniture_presents WHERE id = @itemid"); } Room.floorItemManager.removeItem(itemID, 0); SendResponse(); refreshHand("last"); break; } case "Bw": // Item handling - redeem credit item { if (_isOwner == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); if (Room.floorItemManager.containsItem(itemID)) { string Sprite = Room.floorItemManager.getItem(itemID).Sprite; if (Sprite.Substring(0, 3).ToLower() != "cf_") return; int redeemValue = 0; try { redeemValue = int.Parse(Sprite.Split('_')[1]); } catch { return; } Room.floorItemManager.removeItem(itemID, 0); _Credits += redeemValue; sendData("@F" + _Credits); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("UPDATE users SET credits = '" + _Credits + "' WHERE id = '" + userID + "' LIMIT 1"); } break; } case "AQ": // Item handling - teleporters - enter teleporter { if (_inPublicroom || Room == null || roomUser == null) return; int itemID = int.Parse(currentPacket.Substring(2)); if (Room.floorItemManager.containsItem(itemID)) { Rooms.Items.floorItem Teleporter = Room.floorItemManager.getItem(itemID); // Prevent clientside 'jumps' to teleporter, check if user is removed one coord from teleporter entrance if (Teleporter.Z == 2 && roomUser.X != Teleporter.X + 1 && roomUser.Y != Teleporter.Y) return; else if (Teleporter.Z == 4 && roomUser.X != Teleporter.X && roomUser.Y != Teleporter.Y + 1) return; roomUser.goalX = -1; Room.moveUser(this.roomUser, Teleporter.X, Teleporter.Y, true); } break; } case @"@\": // Item handling - teleporters - flash teleporter { if (_inPublicroom || Room == null || roomUser == null) return; int itemID = int.Parse(currentPacket.Substring(2)); if (Room.floorItemManager.containsItem(itemID)) { Rooms.Items.floorItem Teleporter1 = Room.floorItemManager.getItem(itemID); if (roomUser.X != Teleporter1.X && roomUser.Y != Teleporter1.Y) return; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { int idTeleporter2 = dbClient.ReadInt32("SELECT teleportid FROM furniture WHERE id = '" + itemID + "'"); int roomIDTeleporter2 = dbClient.ReadInt32("SELECT roomid FROM furniture WHERE id = '" + idTeleporter2 + "'"); if (roomIDTeleporter2 > 0) new TeleporterUsageSleep(useTeleporter).BeginInvoke(Teleporter1, idTeleporter2, roomIDTeleporter2, null, null); } } break; } case "AM": // Item handling - dices - close dice { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = int.Parse(currentPacket.Substring(2)); if (Room.floorItemManager.containsItem(itemID)) { Rooms.Items.floorItem Item = Room.floorItemManager.getItem(itemID); string Sprite = Item.Sprite; if (Sprite != "edice" && Sprite != "edicehc") // Not a dice item return; if (!(Math.Abs(roomUser.X - Item.X) > 1 || Math.Abs(roomUser.Y - Item.Y) > 1)) // User is not more than one square removed from dice { Item.Var = "0"; Room.sendData("AZ" + itemID + " " + (itemID * 38)); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("UPDATE furniture SET var = '0' WHERE id = '" + itemID + "' LIMIT 1"); } } break; } case "AL": // Item handling - dices - spin dice { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = int.Parse(currentPacket.Substring(2)); if (Room.floorItemManager.containsItem(itemID)) { Rooms.Items.floorItem Item = Room.floorItemManager.getItem(itemID); string Sprite = Item.Sprite; if (Sprite != "edice" && Sprite != "edicehc") // Not a dice item return; if (!(Math.Abs(roomUser.X - Item.X) > 1 || Math.Abs(roomUser.Y - Item.Y) > 1)) // User is not more than one square removed from dice { Room.sendData("AZ" + itemID); int rndNum = new Random(DateTime.Now.Millisecond).Next(1, 7); Room.sendData("AZ" + itemID + " " + ((itemID * 38) + rndNum), 2000); Item.Var = rndNum.ToString(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("UPDATE furniture SET var = '" + rndNum + "' WHERE id = '" + itemID + "' LIMIT 1"); } } break; } case "CW": // Item handling - spin Wheel of fortune { if (_hasRights == false || Room == null || roomUser == null || _inPublicroom) return; int itemID = Request.PopWiredInt(); if (Room.wallItemManager.containsItem(itemID)) { Rooms.Items.wallItem Item = Room.wallItemManager.getItem(itemID); if (Item.Sprite == "habbowheel") { int rndNum = new Random(DateTime.Now.Millisecond).Next(0, 10); Room.sendData("AU" + itemID + Convert.ToChar(9) + "habbowheel" + Convert.ToChar(9) + " " + Item.wallPosition + Convert.ToChar(9) + "-1"); Room.sendData("AU" + itemID + Convert.ToChar(9) + "habbowheel" + Convert.ToChar(9) + " " + Item.wallPosition + Convert.ToChar(9) + rndNum, 4250); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("UPDATE furniture SET var = '" + rndNum + "' WHERE id = '" + itemID + "' LIMIT 1"); } } break; } case "Dz": // Item handling - activate Love shuffler sofa { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = Request.PopWiredInt(); if (Room.floorItemManager.containsItem(itemID) && Room.floorItemManager.getItem(itemID).Sprite == "val_randomizer") { int rndNum = new Random(DateTime.Now.Millisecond).Next(1, 5); Room.sendData("AX" + itemID + Convert.ToChar(2) + "123456789" + Convert.ToChar(2)); Room.sendData("AX" + itemID + Convert.ToChar(2) + rndNum + Convert.ToChar(2), 5000); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("UPDATE furniture SET var = '" + rndNum + "' WHERE id = '" + itemID + "' LIMIT 1"); } break; } case "AS": // Item handling - stickies/photo's - open stickie/photo { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = int.Parse(Request.Content); if (Room.wallItemManager.containsItem(itemID)) { string Message; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) Message = dbClient.ReadString("SELECT text FROM furniture_stickies WHERE id = '" + itemID + "'"); sendData("@p" + itemID + Convert.ToChar(9) + Room.wallItemManager.getItem(itemID).Var + " " + Message); } break; } case "AT": // Item handling - stickies - edit stickie colour/message { if (_hasRights == false || Room == null || roomUser == null || _inPublicroom) return; int itemID = int.Parse(currentPacket.Substring(2, currentPacket.IndexOf("/") - 2)); if (Room.wallItemManager.containsItem(itemID)) { Rooms.Items.wallItem Item = Room.wallItemManager.getItem(itemID); string Sprite = Item.Sprite; if (Sprite != "post.it" && Sprite != "post.it.vd") return; string Colour = "FFFFFF"; // Valentine stickie default colour if (Sprite == "post.it") // Normal stickie { Colour = currentPacket.Substring(2 + itemID.ToString().Length + 1, 6); if (Colour != "FFFF33" && Colour != "FF9CFF" && Colour != "9CFF9C" && Colour != "9CCEFF") return; } string Message = currentPacket.Substring(2 + itemID.ToString().Length + 7); if (Message.Length > 684) return; if (Colour != Item.Var) using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("UPDATE furniture SET var = '" + Colour + "' WHERE id = '" + itemID + "' LIMIT 1"); Item.Var = Colour; Room.sendData("AU" + itemID + Convert.ToChar(9) + Sprite + Convert.ToChar(9) + " " + Item.wallPosition + Convert.ToChar(9) + Colour); Message = stringManager.filterSwearwords(Message).Replace("/r", Convert.ToChar(13).ToString()); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("var", Message); dbClient.ExecuteQuery("UPDATE furniture_stickies SET text = @var WHERE id = '" + itemID + "' LIMIT 1"); } } break; } case "AU": // Item handling - stickies/photo - delete stickie/photo { if (_isOwner == false || Room == null || roomUser == null || _inPublicroom) return; int itemID = int.Parse(Request.Content); if (Room.wallItemManager.containsItem(itemID) && stringManager.getStringPart(Room.wallItemManager.getItem(itemID).Sprite, 0, 7) == "post.it") { Room.wallItemManager.removeItem(itemID, 0); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("DELETE FROM furniture_stickies WHERE id = '" + itemID + "' LIMIT 1"); } break; } #endregion #region Soundmachines case "Ct": // Soundmachine - initialize songs in soundmachine { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) sendData("EB" + soundMachineManager.getMachineSongList(Room.floorItemManager.soundMachineID)); break; } case "Cu": // Soundmachine - enter room initialize playlist { if (Room != null && Room.floorItemManager.soundMachineID > 0) { if (catalogueManager.getItem(Room.floorItemManager.getItem(Room.floorItemManager.soundMachineID).templateID).SoundMachine) sendData("EC" + soundMachineManager.getMachinePlaylist(Room.floorItemManager.soundMachineID)); else sendData("EC" + Room.getJukeboxPlaylist()); } break; } case "C]": // Soundmachine - get song title and data of certain song { if (Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Request.PopWiredInt(); sendData("Dl" + soundMachineManager.getSong(songID)); } break; } case "Cs": // Soundmachine - save playlist { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int Amount = Request.PopWiredInt(); if (Amount < 6) // Max playlist size { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.ExecuteQuery("DELETE FROM soundmachine_playlists WHERE machineid = '" + Room.floorItemManager.soundMachineID + "'"); for (int i = 0; i < Amount; i++) { int songID = Request.PopWiredInt(); dbClient.ExecuteQuery("INSERT INTO soundmachine_playlists(machineid,songid,pos) VALUES ('" + Room.floorItemManager.soundMachineID + "','" + songID + "','" + i + "')"); } } Room.sendData("EC" + soundMachineManager.getMachinePlaylist(Room.floorItemManager.soundMachineID)); // Refresh playlist } } break; } case "C~": // Sound machine - burn song to disk { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (_Credits > 0 && dbClient.Exists("SELECT id FROM soundmachine_songs WHERE id = '" + songID + "' AND userid = '" + userID + "' AND machineid = '" + Room.floorItemManager.soundMachineID + "'")) { DataRow row = dbClient.ReadDataRow("SELECT title,length FROM soundmachine_songs WHERE id = '" + songID + "'"); string Status = Encoding.encodeVL64(songID) + _Username + Convert.ToChar(10) + DateTime.Today.Day + Convert.ToChar(10) + DateTime.Today.Month + Convert.ToChar(10) + DateTime.Today.Year + Convert.ToChar(10) + row[1] + Convert.ToChar(10) + row[0]; dbClient.ExecuteQuery("INSERT INTO furniture(tid,ownerid,var,songid) VALUES ('" + Config.Soundmachine_burnToDisk_diskTemplateID + "','" + userID + "','" + Status + "', '" + songID + "')"); dbClient.ExecuteQuery("UPDATE soundmachine_songs SET burnt = '1' WHERE id = '" + songID + "' LIMIT 1"); dbClient.ExecuteQuery("UPDATE users SET credits = credits - 1 WHERE id = '" + userID + "' LIMIT 1"); _Credits--; sendData("@F" + _Credits); sendData("EB" + soundMachineManager.getMachineSongList(Room.floorItemManager.soundMachineID)); refreshHand("last"); } else // Virtual user doesn't has enough credits to burn this song to disk, or this song doesn't exist in his/her soundmachine sendData("AD"); } break; } case "Cx": // Sound machine - delete song { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (dbClient.Exists("SELECT id FROM soundmachine_songs WHERE id = '" + songID + "' AND machineid = '" + Room.floorItemManager.soundMachineID + "'")) { dbClient.ExecuteQuery("UPDATE soundmachine_songs SET machineid = '0' WHERE id = '" + songID + "' AND burnt = '1'"); // If the song is burnt atleast once, then the song is removed from this machine dbClient.ExecuteQuery("DELETE FROM soundmachine_songs WHERE id = '" + songID + "' AND burnt = '0' LIMIT 1"); // If the song isn't burnt; delete song from database dbClient.ExecuteQuery("DELETE FROM soundmachine_playlists WHERE machineid = '" + Room.floorItemManager.soundMachineID + "' AND songid = '" + songID + "'"); // Remove song from playlist Room.sendData("EC" + soundMachineManager.getMachinePlaylist(Room.floorItemManager.soundMachineID)); } } break; } #region Song editor case "Co": // Soundmachine - song editor - initialize soundsets and samples { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { songEditor = new virtualSongEditor(Room.floorItemManager.soundMachineID, userID); songEditor.loadSoundsets(); sendData("Dm" + songEditor.getSoundsets()); sendData("Dn" + soundMachineManager.getHandSoundsets(userID)); } break; } case "C[": // Soundmachine - song editor - add soundset { if (songEditor != null && _isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int soundSetID = Encoding.decodeVL64(currentPacket.Substring(2)); int slotID = Encoding.decodeVL64(currentPacket.Substring(Encoding.encodeVL64(soundSetID).Length + 2)); if (slotID > 0 && slotID < 5 && songEditor.slotFree(slotID)) { songEditor.addSoundset(soundSetID, slotID); sendData("Dn" + soundMachineManager.getHandSoundsets(userID)); sendData("Dm" + songEditor.getSoundsets()); } } break; } case @"C\": // Soundmachine - song editor - remove soundset { if (songEditor != null && _isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int slotID = Encoding.decodeVL64(currentPacket.Substring(2)); if (songEditor.slotFree(slotID) == false) { songEditor.removeSoundset(slotID); sendData("Dm" + songEditor.getSoundsets()); sendData("Dn" + soundMachineManager.getHandSoundsets(userID)); } } break; } case "Cp": // Soundmachine - song editor - save new song { if (songEditor != null && _isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { string Title = Request.PopString(); string Data = Request.PopString(); int Length = soundMachineManager.calculateSongLength(Data); if (Length != -1) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("userid", userID); dbClient.AddParamWithValue("machineid", Room.floorItemManager.soundMachineID); dbClient.AddParamWithValue("title", Title); dbClient.AddParamWithValue("length", Length); dbClient.AddParamWithValue("data", Data); dbClient.ExecuteQuery("INSERT INTO soundmachine_songs (userid,machineid,title,length,data) VALUES (@userid,@machineid,@title,@length,@data)"); } sendData("EB" + soundMachineManager.getMachineSongList(Room.floorItemManager.soundMachineID)); sendData("EK" + Encoding.encodeVL64(Room.floorItemManager.soundMachineID) + Title + Convert.ToChar(2)); } } break; } case "Cq": // Soundmachine - song editor - request edit of existing song { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Encoding.decodeVL64(currentPacket.Substring(2)); sendData("Dl" + soundMachineManager.getSong(songID)); songEditor = new virtualSongEditor(Room.floorItemManager.soundMachineID, userID); songEditor.loadSoundsets(); sendData("Dm" + songEditor.getSoundsets()); sendData("Dn" + soundMachineManager.getHandSoundsets(userID)); } break; } case "Cr": // Soundmachine - song editor - save edited existing song { if (songEditor != null && _isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Request.PopWiredInt(); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) if (dbClient.Exists("SELECT id FROM soundmachine_songs WHERE id = '" + songID + "' AND userid = '" + userID + "' AND machineid = '" + Room.floorItemManager.soundMachineID + "'")) { int idLength = Encoding.encodeVL64(songID).Length; int nameLength = Encoding.decodeB64(currentPacket.Substring(idLength + 2, 2)); string Title = currentPacket.Substring(idLength + 4, nameLength); string Data = currentPacket.Substring(idLength + nameLength + 6); int Length = soundMachineManager.calculateSongLength(Data); if (Length != -1) { dbClient.AddParamWithValue("songid", songID); dbClient.AddParamWithValue("title", Title); dbClient.AddParamWithValue("length", Length); dbClient.AddParamWithValue("data", Data); dbClient.ExecuteQuery("UPDATE soundmachine_songs SET title = @title,data = @data,length = @length WHERE id = @songid LIMIT 1"); sendData("ES"); sendData("EB" + soundMachineManager.getMachineSongList(Room.floorItemManager.soundMachineID)); Room.sendData("EC" + soundMachineManager.getMachinePlaylist(Room.floorItemManager.soundMachineID)); } } } break; } #endregion Song editor #region Jukebox //case "DC": // User's burnt CD's // { // sendData(soundMachineManager.getUserCDs(userID)); // break; // } //case "DB": // Jukebox CD's // { // sendData(soundMachineManager.getJukeboxSongs(Room.floorItemManager.soundMachineID)); // break; // } //case "C": // Add song to jukebox // { // if (_isOwner) // { // int songID = Request.PopWiredInt(); // int slotID = Request.PopWiredInt(); // using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) // if (!dbClient.Exists("SELECT jukeboxid FROM jukebox_songs WHERE slotid = " + slotID + " AND jukeboxid = " + Room.floorItemManager.soundMachineID)) // { // dbClient.ExecuteQuery("INSERT INTO jukebox_songs(jukeboxid,songid,slotid) VALUES('" + Room.floorItemManager.soundMachineID + "','" + songID + "','" + slotID + "')"); // dbClient.ExecuteQuery("UPDATE furniture SET roomid = -3 WHERE songid = " + songID); // sendData(soundMachineManager.getJukeboxSongs(Room.floorItemManager.soundMachineID)); // sendData(soundMachineManager.getUserCDs(userID)); // } // } // break; // } //case "D@": // Remove song from jukebox // { // if (_isOwner) // { // int slotID = Request.PopWiredInt(); // int songID = 0; // using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) // songID = dbClient.ReadInt32("SELECT songid FROM jukebox_songs WHERE slotid = " + slotID + " AND jukeboxid = " + Room.floorItemManager.soundMachineID); // if (songID > 0) // { // using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) // { // dbClient.ExecuteQuery("DELETE FROM jukebox_songs WHERE slotid = " + slotID + " AND jukeboxid = " + Room.floorItemManager.soundMachineID); // dbClient.ExecuteQuery("UPDATE furniture SET roomid = 0 WHERE songid = " + songID); // } // sendData(soundMachineManager.getJukeboxSongs(Room.floorItemManager.soundMachineID)); // sendData(soundMachineManager.getUserCDs(userID)); // } // } // break; // } //case "DA": // { // int songID = Request.PopWiredInt(); // try // { // Room.addSongToPlaylist(songID); // } // catch // { // Response.Initalize(337); // "EQ" // SendResponse(); // } // break; // } #endregion #endregion #region Trading case "AG": // Trading - start { if (Room != null || roomUser != null || _tradePartnerUID == -1) { if (Config.enableTrading == false) { sendData("BK" + stringManager.getString("trading_disabled")); return; } int partnerUID = int.Parse(Request.Content); if (Room.containsUser(partnerUID)) { virtualUser Partner = Room.getUser(partnerUID); if (Partner.statusManager.containsStatus("trd")) return; this._tradePartnerUID = partnerUID; this.statusManager.addStatus("trd", ""); this.roomUser.Refresh(); Partner._tradePartnerUID = this.roomUser.roomUID; Partner.statusManager.addStatus("trd", ""); Partner.roomUser.Refresh(); this.refreshTradeBoxes(); Partner.refreshTradeBoxes(); } } break; } case "AH": // Trading - offer item { if (Room != null && roomUser != null && _tradePartnerUID != -1 && Room.containsUser(_tradePartnerUID)) { int itemID = int.Parse(Request.Content); int templateID = 0; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) templateID = dbClient.ReadInt32("SELECT tid FROM furniture WHERE id = '" + itemID + "' AND ownerid = '" + userID + "' AND roomid = '0'"); if (templateID == 0) return; itemTemplate template = catalogueManager.getItem(templateID); if (template.Tradeable == false) { sendData("BK" + stringManager.getString("trading_nottradeable")); return; } _tradeItems[_tradeItemCount] = itemID; _tradeItemCount++; virtualUser Partner = Room.getUser(_tradePartnerUID); this._tradeAccept = false; Partner._tradeAccept = false; this.refreshTradeBoxes(); Partner.refreshTradeBoxes(); } break; } case "AD": // Trading - decline trade { if (Room != null && roomUser != null && _tradePartnerUID != -1 && Room.containsUser(_tradePartnerUID)) { virtualUser Partner = Room.getUser(_tradePartnerUID); this._tradeAccept = false; Partner._tradeAccept = false; this.refreshTradeBoxes(); Partner.refreshTradeBoxes(); } break; } case "AE": // Trading - accept trade (and, if both partners accept, swap items] { if (Room != null && roomUser != null && _tradePartnerUID != -1 && Room.containsUser(_tradePartnerUID)) { virtualUser Partner = Room.getUser(_tradePartnerUID); this._tradeAccept = true; this.refreshTradeBoxes(); Partner.refreshTradeBoxes(); if (Partner._tradeAccept) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { for (int i = 0; i < _tradeItemCount; i++) if (_tradeItems[i] > 0) dbClient.ExecuteQuery("UPDATE furniture SET ownerid = '" + Partner.userID + "',roomid = '0' WHERE id = '" + this._tradeItems[i] + "' LIMIT 1"); for (int i = 0; i < Partner._tradeItemCount; i++) if (Partner._tradeItems[i] > 0) dbClient.ExecuteQuery("UPDATE furniture SET ownerid = '" + this.userID + "',roomid = '0' WHERE id = '" + Partner._tradeItems[i] + "' LIMIT 1"); } abortTrade(); } } break; } case "AF": // Trading - abort trade { if (Room != null && roomUser != null && _tradePartnerUID != -1 && Room.containsUser(_tradePartnerUID)) { abortTrade(); refreshHand("update"); } break; } #endregion #region Ignoring case "D": // Ignore user { string targetName = Request.PopString(); virtualUser Target = userManager.getUser(targetName); if (Target != null && Target._roomID == _roomID) if (!(Target._isOwner || (Target._Rank >= 4 && Target._Rank > _Rank)) && _ignoredUsers.Contains(targetName) == false) { _ignoredUsers.Add(Target._Username); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("INSERT INTO users_ignores(userid,ignoredname) VALUES('" + userID + "','" + Target._Username + "')"); Response.Initalize(419); // "Fc" Response.AppendBoolean(true); SendResponse(); } break; } case "EB": // Unignore user { string targetName = Request.PopString(); virtualUser Target = userManager.getUser(targetName); if (Target != null && Target._roomID == _roomID && _ignoredUsers.Contains(targetName) == true) { _ignoredUsers.Remove(targetName); using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) dbClient.ExecuteQuery("DELETE FROM users_ignores WHERE userid = '" + userID + "' AND ignoredname = '" + Target._Username + "'"); Response.Initalize(419); // "Fc" Response.AppendBoolean(true); SendResponse(); } break; } #endregion #region Games case "Ai": // Buy game-tickets { int Amount = Request.PopWiredInt(); string Receiver = Request.PopString(); int Ticketamount = 0; int Price = 0; if (Amount == 1) // Look how much tickets you want { Ticketamount = 2; Price = 1; } else if (Amount == 2) // And again { Ticketamount = 20; Price = 6; } else // Wrong parameter return; if (Price > _Credits) // Enough credits? { sendData("AD"); return; } int ReceiverID = userID; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", Receiver); ReceiverID = dbClient.ReadInt32("SELECT id FROM users WHERE name = @name"); } if (!(ReceiverID > 0)) // Does the user exist? { sendData("AL" + Receiver); return; } _Credits -= Price; // New credit amount sendData("@F" + _Credits); // Send the new credits using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.ExecuteQuery("UPDATE users SET credits = '" + _Credits + "' WHERE id = '" + userID + "' LIMIT 1"); // Update receivers ticketamount dbClient.ExecuteQuery("UPDATE users SET tickets = tickets + " + Ticketamount + " WHERE id = '" + ReceiverID + "' LIMIT 1"); } if (userManager.containsUser(ReceiverID)) // Check or the user is online { virtualUser _Receiver = userManager.getUser(ReceiverID); // Get him/her _Receiver._Tickets = _Receiver._Tickets + Ticketamount; // Update ticketamount if (ReceiverID == userID) // Stop double kaching _Receiver.refreshValueables(false, true); // Kaching! else _Receiver.refreshValueables(true, true); // Kaching! } sendData("AC"); // Yey! Buying Successful break; } #region Lido case "Ah": // Statuses - Lido Voting - "Ah" { if (Room != null && roomUser != null && statusManager.containsStatus("swim") == false && statusManager.containsStatus("lay") == false) { string signID = Request.Content; statusManager.handleStatus("sign", signID, Config.Statuses_Wave_waveDuration); statusManager.Refresh(); if (Room.Diver != null && roomUser.hasLidoVoted == false) { switch (signID) { case "1": { Room.divingVotes.Add(4); break; } case "2": { Room.divingVotes.Add(5); break; } case "3": { Room.divingVotes.Add(6); break; } case "4": { Room.divingVotes.Add(7); break; } case "5": { Room.divingVotes.Add(8); break; } case "6": { Room.divingVotes.Add(9); break; } case "7": { Room.divingVotes.Add(10); break; } } roomUser.hasLidoVoted = true; } } break; } case "Aj": // "JUMPPERF" - "Aj" { if (Room != null && roomUser != null && Room.Diver == roomUser) { string Packet = Request.Content; Room.sendData("AJ" + roomUser.roomUID + Convert.ToChar(13) + Packet); } break; } case "Ak": // "SPLASH_POSITION" - "Ak" { if (roomUser != null && Room != null && Room.Diver == roomUser) { // Get the landing coordinates string[] Cords = currentPacket.Substring(2).Split(','); // TODO: Anti-scripting? // Open the evelator door for the next diver Room.sendSpecialCast("door", "open"); // Make a big splash at the users coordinates Room.sendSpecialCast("BIGSPLASH position", Cords[0] + "," + Cords[1]); // Make the lido screen target the diver Room.sendSpecialCast("cam1", "targetcamera " + roomUser.roomUID); // Clean up Room.Diver = null; Room.sqUNIT[roomUser.X, roomUser.Y] = false; Room.sqUNIT[26, 3] = false; roomUser.X = int.Parse(Cords[0]); roomUser.Y = int.Parse(Cords[1]); // Reset the voting status of all roomUsers foreach (virtualRoomUser rUser in Room._Users.Values) { rUser.hasLidoVoted = false; } // Make the user swim to the ladder roomUser.walkLock = false; roomUser.H = Room.sqFLOORHEIGHT[int.Parse(Cords[0]), int.Parse(Cords[1])]; if (roomUser.H <= 7) statusManager.addStatus("swim", ""); // Ladder coordinates roomUser.goalX = 20; roomUser.goalY = 19; // Calculate the score float sum = 0; float final = 0; foreach(int vote in Room.divingVotes) sum += float.Parse(vote.ToString()); final = sum / Room.divingVotes.Count; if (float.IsNaN(final)) final = 0; // Clear votes Room.divingVotes.Clear(); // Show the score on the lido screen Room.sendSpecialCast("cam1", "showtext " + _Username + "'s score:/" + final); } break; } #endregion #endregion #region Infobus case "Ap": { switch (Request.Content) // TODO: Prevent users from voting more than 1 time? { case "1": // User voted A { Room.InfobusPoll_answers[0]++; break; } case "2": // User voted B { Room.InfobusPoll_answers[1]++; break; } case "3": // User voted C { Room.InfobusPoll_answers[2]++; break; } case "4": // User voted D { Room.InfobusPoll_answers[3]++; break; } case "5": // User voted E { Room.InfobusPoll_answers[4]++; break; } case "6": // User voted F { Room.InfobusPoll_answers[5]++; break; } } break; } #endregion #endregion default: { Out.WriteError("UNKNOWN PACKET [" + Request.Header + ", [" + Request.GetPacket + "]", Out.logFlags.MehAction); break; } } } #endregion } } #endregion #region Update voids /// /// Refreshes /// /// Specifies if the details have to be reloaded from database, or to use current _ /// Specifies if the @E packet (which contains username etc) has to be resent. ///Specifies if the user has to be refreshed in room by using the 'poof' animation. internal void refreshAppearance(bool Reload, bool refreshSettings, bool refreshRoom) { if (Reload) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { DataRow row = dbClient.ReadDataRow("SELECT figure,sex,mission FROM users WHERE id = '" + userID + "'"); _Figure = row[0].ToString(); _Sex = char.Parse(row[1].ToString()); _Mission = row[2].ToString(); } } if (refreshSettings) { FuseBuilder Message = new FuseBuilder(5); // "@E" Message.AppendString(connectionID); Message.AppendString(_Username); Message.AppendString(_Figure); Message.AppendString(_Sex); Message.AppendString(_Mission); Message.AppendChar(2); Message.AppendWired(12); Message.AppendString("ch=s02/53,51,44"); Message.AppendWired(0); Message.AppendWired(1); sendData(Message); } if (refreshRoom && Room != null && roomUser != null) { FuseBuilder Message = new FuseBuilder(266); // "DJ" Message.AppendWired(roomUser.roomUID); Message.AppendString(_Figure); Message.AppendString(_Sex); Message.AppendString(_Mission); Room.sendData(Message); } } /// /// Reloads the valueables (tickets and credits) from database and updates them for client. /// /// Specifies if to reload and update the Credit count. /// Specifies if to reload and update the Ticket count. internal void refreshValueables(bool Credits, bool Tickets) { if (Credits) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) _Credits = dbClient.ReadInt32("SELECT credits FROM users WHERE id = '" + userID + "'"); FuseBuilder Message = new FuseBuilder(6); // "@F" Message.Append(_Credits); sendData(Message); // Camera photos Message = new FuseBuilder(4); // "@D" Message.Append(20); sendData(Message); } if (Tickets) { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) _Tickets = dbClient.ReadInt32("SELECT tickets FROM users WHERE id = '" + userID + "'"); FuseBuilder Message = new FuseBuilder(124); // "A|" Message.Append(_Tickets); sendData(Message); } } /// /// Refreshes the users Club subscription status. /// internal void refreshClub() { int restingDays = 0; int passedMonths = 0; int restingMonths = 0; DataRow row; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { row = dbClient.ReadDataRow("SELECT months_expired,months_left,date_monthstarted FROM users_club WHERE userid = '" + userID + "'"); } if(row != null) { passedMonths = Convert.ToInt32(row[0]); restingMonths = Convert.ToInt32(row[1]) - 1; restingDays = (int)(DateTime.Parse(row[2].ToString())).Subtract(DateTime.Now).TotalDays + 32; _clubMember = true; } sendData("@Gclub_habbo" + Convert.ToChar(2) + Encoding.encodeVL64(restingDays) + Encoding.encodeVL64(passedMonths) + Encoding.encodeVL64(restingMonths) + Encoding.encodeVL64(1)); } /// /// Refreshes the user's badges. /// internal void refreshBadges() { Badges.Clear(); DataTable table; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) table = dbClient.ReadDataTable("SELECT badgeid,slotid FROM users_badges WHERE userid = '" + userID + "' ORDER BY slotid ASC"); FuseBuilder Message = new FuseBuilder(229); // "Ce" Message.AppendWired(table.Rows.Count); foreach (DataRow row in table.Rows) { userBadge badge = userBadge.Parse(row); Badges.Add(badge); Message.AppendString(badge.badgeID); } foreach (userBadge badge in Badges) if (badge.slotID > 0) { Message.AppendWired(badge.slotID); Message.AppendString(badge.badgeID); } sendData(Message); sendData("FtH"); //// Now, we send the archivements! //FuseBuilder Packet = new FuseBuilder(436); // Ft //List System_archivements = archievementManager.getArchivements(); //List Archivements = archievementManager.getArchivements(userID); //List Final_Archivements = new List(); //foreach (archievementManager.Archievement ac in System_archivements) //{ // bool Add = true; // foreach (archievementManager.Archievement acr in Archivements) // { // if (acr.ID == ac.ID) // Add = false; // } // if (Add) // Final_Archivements.Add(ac); //} //Packet.AppendWired(Final_Archivements.Count); //foreach (archievementManager.Archievement archivement in Final_Archivements) //{ // Packet.AppendWired(archivement.ID); // Packet.AppendBoolean(true); // Packet.Append(archivement.BadgeName + archivement.Grade); // Packet.AppendChar(2); //} //sendData(Packet.ToString()); } /// /// Refreshes the user's group status. /// internal void refreshGroupStatus() { using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { _groupID = dbClient.ReadInt32("SELECT groupid FROM groups_memberships WHERE userid = '" + userID + "' AND is_current = '1'"); if (_groupID > 0) // User is member of a group _groupMemberRank = dbClient.ReadInt32("SELECT member_rank FROM groups_memberships WHERE userid = '" + userID + "' AND groupID = '" + _groupID + "'"); } } internal void refreshHand(string Mode) { DataTable furniInfo; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("id", userID); furniInfo = dbClient.ReadDataTable("SELECT * FROM furniture WHERE ownerid = @id AND roomid = 0 ORDER BY id ASC"); } int endId = furniInfo.Rows.Count; switch (Mode) { case "next": _handPage++; break; case "prev": _handPage--; break; case "last": _handPage = (endId - 1) / 9; break; case "update": // Nothing, keep handpage the same break; default: // Probably, "new" _handPage = 0; break; } buildHand(endId, furniInfo); } internal void buildHand(int endId, DataTable furniInfo) { //##############CREDITS TO JOEH FOR MAKING PROJECT THOR############## FuseBuilder Message = new FuseBuilder(140); // "BL" int startId = 0; if (furniInfo.Rows.Count > 0) { startId = _handPage * 9; if (endId > (startId + 9)) { endId = startId + 9; } if (startId > endId || startId == endId) { _handPage--; buildHand(endId, furniInfo); return; } for (int i = startId; i < endId; i++) { itemTemplate template = catalogueManager.getItem(Convert.ToInt32(furniInfo.Rows[i]["tid"])); if (template.TypeID > 0) // TODO: Check if item is being traded, if so, don't list it here! { Message.AppendString("SI", 30); Message.AppendString(furniInfo.Rows[i]["id"], 30); Message.AppendString(i, 30); Message.AppendString("S", 30); Message.AppendString(furniInfo.Rows[i]["id"], 30); Message.AppendString(template.Sprite, 30); Message.AppendString(template.Length, 30); Message.AppendString(template.Width, 30); Message.AppendString(furniInfo.Rows[i]["var"], 30); Message.AppendString(template.Colour, 30); Message.Append(template.Recycleable ? "1" : "0"); Message.AppendChar(30); Message.AppendString(template.Sprite, 30); Message.Append("/"); } else { string Sprite = template.Sprite; string Colour = template.Colour; if (template.posterString != null) { Sprite = template.posterString[0]; Colour = template.posterString[1]; } Message.AppendString("SI", 30); Message.AppendString(furniInfo.Rows[i]["id"], 30); Message.AppendString(i, 30); Message.AppendString("I", 30); Message.AppendString(furniInfo.Rows[i]["id"], 30); Message.AppendString(Sprite, 30); if (Sprite == "post.it" || Sprite == "post.it.vd") Message.AppendString(furniInfo.Rows[i]["var"], 30); else Message.AppendString(Colour, 30); Message.Append(template.Recycleable ? "1" : "0"); Message.Append("/"); } } } Message.AppendChar(13); Message.Append(furniInfo.Rows.Count); sendData(Message); } internal void refreshIgnoreList() { FuseBuilder Message = new FuseBuilder(420); // "Fd" DataTable table; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) table = dbClient.ReadDataTable("SELECT * FROM users_ignores WHERE userid = '" + userID + "'"); _ignoredUsers = new List(); foreach (DataRow row in table.Rows) { _ignoredUsers.Add(row["ignoredname"].ToString()); Message.AppendString(row["ignoredname"]); } sendData(Message); } /// /// Refreshes the trade window for the user. /// internal void refreshTradeBoxes() { if (Room != null && Room.containsUser(_tradePartnerUID) && roomUser != null) { virtualUser Partner = Room.getUser(_tradePartnerUID); FuseBuilder Message = new FuseBuilder(108); // "Al" Message.AppendString(_Username, 9); Message.AppendString(_tradeAccept.ToString().ToLower(), 9); if (_tradeItemCount > 0) Message.Append(catalogueManager.tradeItemList(_tradeItems)); Message.AppendChar(13); Message.AppendString(Partner._Username, 9); Message.AppendString(Partner._tradeAccept.ToString().ToLower(), 9); if (Partner._tradeItemCount > 0) Message.Append(catalogueManager.tradeItemList(Partner._tradeItems)); sendData(Message); } } /// /// Aborts the trade between this user and his/her partner. /// internal void abortTrade() { if (Room != null && Room.containsUser(_tradePartnerUID) && roomUser != null) { virtualUser Partner = Room.getUser(_tradePartnerUID); FuseBuilder Message = new FuseBuilder(110); // "An" this.sendData(Message); this.refreshHand("update"); Partner.sendData(Message); Partner.refreshHand("update"); this._tradePartnerUID = -1; this._tradeAccept = false; this._tradeItems = new int[65]; this._tradeItemCount = 0; this.statusManager.removeStatus("trd"); this.roomUser.Refresh(); Partner._tradePartnerUID = -1; Partner._tradeAccept = false; Partner._tradeItems = new int[65]; Partner._tradeItemCount = 0; Partner.statusManager.removeStatus("trd"); Partner.roomUser.Refresh(); } } #endregion #region Misc voids /// /// Checks if a certain chat message was a 'speech command', if so, then the action for this command is processed and a 'true' boolean is returned. Otherwise, 'false' is returned. /// /// The chat message that was used. private bool isSpeechCommand(string Text) { string[] args = Text.Split(' '); try // Try/catch, on error (eg, target user offline, parameters incorrect etc) then failure message will be sent { switch (args[0].ToLower()) // arg[0] = command itself { #region Disabled commands //#region :lidofix //case "lidofix": // { // if (rankManager.containsRight(_Rank, "fuse_lido") == false && rankManager.containsRight(_Rank, "fuse_administrator_access") == false) // return false; // Room.Diver = null; // Room.DiveDoorOpen = true; // Room.sendData("AGdoor open"); // break; // } //#endregion #region :about case "about": // Display information about the emulator { FuseBuilder Packet = new FuseBuilder(139); // BK Packet.Append("Informasjon:
"); Packet.Append("Habroxhotell Edition 1.5
"); Packet.Append("Ansatte:
"); DataTable Staffs; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) Staffs = dbClient.ReadDataTable("SELECT * FROM users WHERE rank >= 6"); foreach (DataRow Staff in Staffs.Rows) { Packet.Append("[" + Staff["rank"] + "] - " + Staff["name"] + "
"); } Packet.Append("Holograph Emulator made by Nillus."); Packet.Append("snuppa10/Kjent/Ukjent/Unknown/Audun/awa500 FTW!"); sendData(Packet.ToString()); break; } #endregion #region :cleanhand case "cleanhand": case "emptyhand": // Deletes everything from the senders hand { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.ExecuteQuery("DELETE FROM furniture WHERE ownerid = '" + userID + "' AND roomid = '0'"); } refreshHand("update"); break; } #endregion #region :commands case "commands": // commands list { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } sendData("BK" + "Holo Hotel Syntax Commands \r" + "\r" + ":alert \r" + ":roomalert \r" + ":kick \r" + ":roomkick \r" + ":shutup \r" + ":unmute \r" + ":roomshutup \r" + ":roomunmute\r" + ":ban \r" + ":superban \r" + ":ha \r" + ":ra \r" + ":teleport \r" + ":warp X Y\r" + ":position \r" + ":transfer \r" + ":refresh \r" + ":find \r" + ":coins \r" + //":masscredits \r" + ":info \r"); break; } #endregion #region :VIP case "blabla22": // give user VIP + badges, credits etc. following { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; using (DatabaseClient dbClient = (Eucalypt.dbManager.GetClient())) { dbClient.AddParamWithValue("name", args[1]); dbClient.AddParamWithValue("rank", args[2]); dbClient.AddParamWithValue("id", dbClient.ReadInt32("SELECT id FROM users WHERE name = @name")); if (args[2] == "3") { dbClient.ExecuteQuery("UPDATE users SET rank = @rank, credits = credits + 3000 WHERE name = @name"); dbClient.ExecuteQuery("INSERT INTO users_badges(userid, badgeid) VALUES(@id, 'VIP')"); } else if (args[2] == "4") { dbClient.ExecuteQuery("UPDATE users SET rank = @rank, credits = credits + 12000 WHERE name = @name"); dbClient.ExecuteQuery("INSERT INTO users_badges(userid, badgeid) VALUES(@id, 'VIP2')"); dbClient.ExecuteQuery("INSERT INTO users_badges(userid, badgeid) VALUES(@id, 'VIP3')"); dbClient.ExecuteQuery("INSERT INTO users_badges(userid, badgeid) VALUES(@id, 'VIP4')"); } } if (userManager.containsUser(args[1])) { virtualUser Target = userManager.getUser(args[1]); Target.refreshBadges(); Target.refreshValueables(true, false); Target._Rank = byte.Parse(args[2]); Target.sendData("@B" + rankManager.fuseRights(Target._Rank)); Target.sendData("BK" + "Du er nÃ¥ blitt VIP (rank " + (int.Parse(args[2]) - 2) + ")!"); } break; } #endregion //#region :whosonline //case "whosonline": //case "online": //case "connections": // Generates a list of users connected // sendData(userManager.generateWhosOnline(rankManager.containsRight(_Rank, "fuse_administrator_access", userID))); // break; //#endregion #region :superepicleet //case "cam1": // { // Room.sendSpecialCast("cam1", "showtext Jeg, " + _Username + "/er stunnet i 10 sekunder/- Ukjent"); // Thread locker = new Thread(new ThreadStart(fagLock)); // locker.Start(); // } // break; case "cam2": { Room.sendSpecialCast("cam1", "showtext " + Text.Substring(args[0].Length)); break; } case "cam3": Room.sendData("AGcam1 targetcamera " + userManager.getUser(args[1]).roomUser.roomUID); break; #endregion //#region Pet transform commands //case "lettlurt1": // Sjekk om de virker // { // if (_Rank >= 7) // { // if (_isPet == false) // {//prøv // string[] colours = new string[] { "FFFFFF", "660066", "0000EE", "FF0000", "00FF00", "FFCCFF", "FFCC00", "996600", "33FFFF" }; // roomUser.makePet(colours[new Random().Next(0, colours.Length - 1)], new Random().Next(0, 20), 2); // } // else // { // roomUser.makeHuman(); // } // } // else // sendData("BK" + "Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // break; // } //case "lettlurt2": // Sjekk om de virker // { // if (_Rank >= 7) // { // if (_isPet == false) // {//prøv // string[] colours = new string[] { "FFFFFF", "660066", "0000EE", "FF0000", "00FF00", "FFCCFF", "FFCC00", "996600", "33FFFF" }; // roomUser.makePet(colours[new Random().Next(0, colours.Length - 1)], new Random().Next(0, 20), 1); // } // else // { // roomUser.makeHuman(); // } // } // else // sendData("BK" + "Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // break; // } //case "lettlurt3": // Sjekk om de virker // { // if (_Rank >= 3) // { // if (_isPet == false) // {//prøv // string[] colours = new string[] { "FFFFFF", "660066", "0000EE", "FF0000", "00FF00", "FFCCFF", "FFCC00", "996600", "33FFFF" }; // roomUser.makePet(colours[new Random().Next(0, colours.Length - 1)], new Random().Next(0, 20), 0); // } // else // { // roomUser.makeHuman(); // } // } // else // sendData("BK" + "Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // break; // } //#endregion //#region naken //case "naken": // { // if (_Rank < 3) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // switch (args[1]) // { // case "red": // _Figure = "hd-180-59"; // break; // case "blue": // _Figure = "hd-180-58"; // break; // case "green": // _Figure = "hd-180-52"; // break; // case "purple": // _Figure = "hd-180-55"; // break; // case "black": // _Figure = "hd-180-61"; // break; // case "white": // _Figure = "hd-180-62"; // break; // case "grey": // _Figure = "hd-180-63"; // break; // case "orange": // _Figure = "hd-180-47"; // break; // case "yellow": // _Figure = "hd-180-66"; // break; // } // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :redman osv (gamle) //case "redman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-59"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :blueman //case "blueman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-58"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region //case "moonwalk": // Display information about the emulator // { // if (_Rank >= 1) // { // if (!roomUser.User._Moon) // { // _Moon = true; // sendData("BK" + "Moonwalk Status: Aktiv"); // } // else // { // _Moon = false; // sendData("BK" + "Moonwalk Status: Inaktiv"); // } // } // break; // } //#endregion //#region :greenman //case "greenman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-52"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :purpleman //case "purpleman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-55"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :blackman //case "blackman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-61"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :whiteman //case "whiteman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-62"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :greyman //case "greyman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-63"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :orangeman //case "orangeman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-47"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :yellowman //case "yellowman": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 1 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-66"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :poof //case "poof": // Refreshes users look // refreshAppearance(true, true, true); // break; //#endregion //#region :debug //case "debug": // processPacket(FuseMessage.Parse(Text.Substring(6))); // break; //#endregion #region :teleport/:warp case "teleport": // Toggles the user's teleport ability on/off { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; else { roomUser.SPECIAL_TELEPORTABLE = (roomUser.SPECIAL_TELEPORTABLE != true); // Reverse the bool refreshAppearance(false, false, true); // Use the poof animation } break; } case "warp": // Warps the virtual user to a certain X,Y coordinate { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; else { int X = int.Parse(args[1]); int Y = int.Parse(args[2]); Out.WriteLine("X: " + X.ToString()); Out.WriteLine("Y: " + Y.ToString()); roomUser.X = X; roomUser.Y = Y; roomUser.goalX = -1; Room.Refresh(roomUser); refreshAppearance(false, false, true); // Use the poof animation } break; } #endregion #region Misc case "groupbadge": { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } else { int groupID = int.Parse(args[1]); string Badge = args[2]; DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.ReadDataTable("SELECT userid FROM groups_memberships WHERE groupid = '" + groupID + "' AND is_pending = '0'"); foreach (DataRow dRow in dTable.Rows) { virtualUser User = userManager.getUser(int.Parse(dRow["userid"].ToString())); dbClient.ExecuteQuery("INSERT INTO users_badges(userid, badgeid) VALUES('" + dRow["userid"].ToString() + "', '" + Badge + "')"); try { User.refreshBadges(); } catch { } } } } break; } case "globalcredits": { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } else { Int64 credittoupdate = int.Parse(args[1]); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.ExecuteQuery("UPDATE users SET credits = credits + '" + credittoupdate + "'"); } foreach (virtualUser User in userManager._Users.Values) User.refreshValueables(true, false); } break; } case "globalbadge": { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } else { string Badge = args[1]; DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.ReadDataTable("SELECT id FROM users"); foreach (DataRow dRow in dTable.Rows) { dbClient.ExecuteQuery("INSERT INTO users_badges(userid, badgeid) VALUES('" + dRow["id"].ToString() + "', '" + Badge + "')"); } } foreach (virtualUser User in userManager._Users.Values) User.refreshBadges(); } break; } case "roombadge": { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } else { string Badge = args[1]; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { foreach (virtualRoomUser User in Room.Users) { dbClient.ExecuteQuery("INSERT INTO users_badges(userid, badgeid) VALUES('" + User.User.userID + "', '" + Badge + "')"); User.User.refreshBadges(); } } } break; } case "foreverwave": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; string user = args[1]; // @ZH virtualUser User = userManager.getUser(args[1]); User.statusManager.addStatus("wave", ""); User.statusManager.Refresh(); break; } case "dance": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) { return false; } string user = args[1]; // @ZH virtualUser User = userManager.getUser(args[1]); System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); User.statusManager.addStatus("dance", ""); User.statusManager.Refresh(); break; } case "m4ssw4ve": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) { return false; } System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); foreach (virtualRoomUser User in Users.Values) { User.statusManager.removeStatus("dance"); User.statusManager.handleStatus("wave", "", Config.Statuses_Wave_waveDuration); } break; } case "m4ssd4nce": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) { return false; } System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); foreach (virtualRoomUser User in Users.Values) { User.statusManager.addStatus("dance", ""); User.statusManager.Refresh(); } break; } case "t4lk": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) { return false; } string Message = Text.Substring(args[0].Length + args[1].Length + 2); virtualUser User = userManager.getUser(args[1]); User.Room.sendShout(User.roomUser, Message); break; } case "m4sst4lk": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) { return false; } foreach (virtualRoomUser User in Room._Users.Values) { User.Room.sendShout(User, Text.Substring(8)); } break; } case "wave": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) { return false; } string user = args[1]; // @ZH virtualUser User = userManager.getUser(args[1]); User.statusManager.removeStatus("dance"); System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); User.statusManager.handleStatus("wave", "", Config.Statuses_Wave_waveDuration); break; } #endregion #region :credits case "credits": { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } else { virtualUser User = userManager.getUser(args[1]); Int64 credittoupdate = int.Parse(args[2]); Int64 oldcredits = new int(); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { oldcredits = dbClient.ReadInt32("SELECT credits FROM users WHERE name = '" + args[1] + "'"); } Int64 newcredits = oldcredits + credittoupdate; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.ExecuteQuery("UPDATE users SET credits = " + newcredits + " WHERE name = '" + args[1] + "'"); } Room.Refresh(roomUser); User.refreshAppearance(true, true, true); User.refreshValueables(true, false); sendData("BK" + "The user " + (args[1]) + " has received " + credittoupdate + " credits"); } break; } #endregion #region :masscredits case "masscredits": { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } else { Int64 credittoupdate = int.Parse(args[1]); foreach (virtualUser User in userManager._Users.Values) { Int64 newcredits = User._Credits + credittoupdate; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.ExecuteQuery("UPDATE users SET credits = " + newcredits + " WHERE name = '" + User._Username + "'"); } User.refreshValueables(true, false); } } break; } #endregion #region :massbadge case "massbadge": { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } else { string Badge = args[1]; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { foreach (virtualUser User in userManager._Users.Values) { dbClient.ExecuteQuery("INSERT INTO users_badges(userid, badgeid) VALUES('" + User.userID + "', '" + Badge + "')"); User.refreshBadges(); } } } break; } #endregion #region :pickall case "pickall": { if (_isOwner && _Rank >= 3) { System.Collections.Hashtable Furnis_floor = (System.Collections.Hashtable)Room.floorItemManager._Items.Clone(); System.Collections.Hashtable Furnis_wall = (System.Collections.Hashtable)Room.wallItemManager._Items.Clone(); foreach (Holo.Virtual.Rooms.Items.wallItem Item in Furnis_wall.Values) //wallitems { Room.wallItemManager.removeItem(Item.ID, userID); } foreach (Holo.Virtual.Rooms.Items.floorItem Item in Furnis_floor.Values) // flooritems { Room.floorItemManager.removeItem(Item.ID, userID); } refreshHand("update"); } else sendData("BK" + "Du mÃ¥ være VIP level 1 og eier av dette rommet for Ã¥ bruke denne kommandoen!");//skal VIP få plukke opp alt fra alles rom?NEU break; } #endregion #region :wheres case "wheres": { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) { return false; } else { string lookup = args[1]; virtualUser Usertarget = userManager.getUser(lookup); if (Usertarget == null) { sendData("BK" + "ERROR #1: \rThe user is offline or does not exist"); } int roomtarget = Usertarget._roomID; if (roomtarget != 0) { string roomowner; string roomname; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { roomname = dbClient.ReadString("SELECT name FROM rooms WHERE id = '" + roomtarget + "'"); roomowner = dbClient.ReadString("SELECT owner FROM rooms WHERE id = '" + roomtarget + "'"); } sendData("BK" + "Brukeren " + args[1] + " er i rommet \r" + "Room name: " + roomname + " \r" + "Owned by: " + roomowner + " \r\r" + ""); } else { sendData("BK" + "ERROR #2: \r The user " + args[1] + " is in the hotelview \r" + ""); } } break; } #endregion #region :disconnect case "disconnect": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; else { virtualUser User = userManager.getUser((args[1])); User.Disconnect(); sendData("BKUser " + args[1] + " normally disconnected >:)"); break; } } #endregion #region :userinfo case "ui": case "userinfo": // Generates a list of information about a certain virtual user { if (rankManager.containsRight(_Rank, "fuse_moderator_access") == false) return false; else sendData("BK" + userManager.generateUserInfo(userManager.getUserID(args[1]), _Rank)); break; } #endregion #region :cords case "cords": // Returns the cords of the user { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; else sendData("BK" + "X: " + roomUser.X + "\rY: " + roomUser.Y + "\rH: " + roomUser.H); break; } #endregion #region :sendme case "sendme": // Sends the user the packet they enter (Debug Reasons); { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; else sendData(stringManager.wrapParameters(args, 1)); break; } #endregion //#region :refresh //case "refresh": // Updates certain parts of the server. // { // if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) // return false; // else // { // try // { // Thread Refresher; // ThreadStart tStarter = null; // switch (args[1]) // { // case "catalogue": // Refresh the catalogue // { // tStarter = new ThreadStart(refresh_cat); // break; // } // case "categories": // room categories // navigatorManager.Init(); // break; // case "strings": // Refresh the catalogue // { // tStarter = new ThreadStart(refresh_strings); // break; // } // case "config": // Refresh the catalogue // { // tStarter = new ThreadStart(refresh_config); // break; // } // case "filter": // Refresh the catalogue // { // tStarter = new ThreadStart(refresh_filter); // break; // } // case "fuse": // Refresh the catalogue // { // tStarter = new ThreadStart(refresh_fuse); // break; // } // case "eco": // Refresh the catalogue // { // tStarter = new ThreadStart(refresh_eco); // break; // } // case "archivements": // Refresh the archievments // { // tStarter = new ThreadStart(refresh_archivement); // break; // } // case "modeldata": // Refresh the modeldata and modeldata triggers // { // tStarter = new ThreadStart(refresh_modeldata); // break; // } // default: // sendData("BK" + stringManager.getString("scommand_failed")); // return true; // } // Refresher = new Thread(tStarter); // Refresher.Priority = ThreadPriority.BelowNormal; // Refresher.Start(); // sendData("BK" + stringManager.getString("scommand_success")); // } // catch // { // sendData("BK" + ":refresh catalogue\r" + // ":refresh eco\r" + // ":refresh strings\r" + // ":refresh config\r" + // ":refresh filter\r" + // ":refresh fuse\r"); // } // break; // } // } //#endregion //#region :infobus //case "infobus": // { // if (rankManager.containsRight(_Rank, "fuse_administrator_access", userID) == true) // { // SortedList Questions = new SortedList(); // string Title; // DataTable dTable; // using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // { // Title = dbClient.getString("SELECT question from infobus WHERE id = 0"); // dTable = dbClient.ReadDataTable("SELECT id, question FROM infobus"); // } // FuseBuilder Packet = new FuseBuilder("AO" + Title + Convert.ToChar(13)); // foreach (DataRow dRow in dTable.Rows) // { // Questions.Add(int.Parse(dRow["id"].ToString()), dRow["question"].ToString()); // } // Questions.Remove(0); // int i = 0; // int Char = 13; // foreach (string Question in Questions.Values) // { // i++; // if (i == Questions.Count) // Char = 2; // Packet.Append(i + ":" + Question + Convert.ToChar(Char)); // } // Room.InfobusPoll_answers = new int[Questions.Count]; // Room.sendData(Packet.ToString());//"AO" + question_tittel + Convert.ToChar(13) + "1:" + question_1 + Convert.ToChar(13) + "2:" + question_2 + Convert.ToChar(13) + "3:" + question_3 + Convert.ToChar(13) + "4:" + question_4 + Convert.ToChar(13) + "5:" + question_5 + Convert.ToChar(13) + "6:" + question_6 + Convert.ToChar(2)); // Thread InfobusStopper = new Thread(Room.InfobusStop); // InfobusStopper.Priority = ThreadPriority.Lowest; // InfobusStopper.Start(); // } // break; // } //#endregion //#region :punker //case "punker": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-59.ch-255-92.ch-267-110.lg-275-67.lg-280-62.sh-300-90.hr-125-61.hr-135-59"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :djevelmann //case "djevelmann": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hr-831-47.hd-180-47.ch-215-47.lg-280-47.sh-290-47.he-1604-47.hr-831-47.hd-180-47.ch-803-47.lg-275-47.sh-295-47.he-1609-47"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :king //case "king": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hd-180-3.ch-210-73.lg-280-73.sh-290-110.hr-170-36.ha-1016-.hd-180-3.ch-808-92.lg-275-92.sh-295-92.hr-891-36.ha-1016-"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :djevelkvinne //case "djevelkvinne": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hr-838-47.hd-600-47.ch-816-47.lg-710-47.sh-730-47.he-1608-47.ca-1804-47.hr-838-47.hd-600-47.ch-824-47.lg-700-47.sh-730-47.he-1609-47.ca-1804-47"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :berg //case "berg": // { // if (_Rank < 7) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være staff for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hr-115-61.hd-190-52.ch-255-85.lg-280-64.sh-290-92.hr-115-61.hd-190-52.ch-267-110.lg-280-64.sh-290-92"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion //#region :queen //case "queen": // { // if (_Rank < 1) // { // FuseBuilder Response = new FuseBuilder(139); // "BK" - alert // Response.Append("Du mÃ¥ være VIP level 2 for Ã¥ bruke denne kommandoen!"); // sendData(Response); // return false; // return false = melding vil komme opp som vanlig chat, break/return true = kommer ikke opp på chat // } // else if (_isNaked == false) // { // // Du må ikke oppdatere i databasen, da vet ikke sereren hvilken figur som var den gamle // //using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) // //{ // // dbClient.ExecuteQuery("UPDATE users SET figure = 'hd-180-59' WHERE id = '" + userID + "'"); // //} // _Figure = "hr-836-59.hd-629-3.ch-645-92.lg-700-110.sh-725-102.he-1604-.hr-836-45.hd-629-3.ch-824-102.lg-700-110.sh-730-110.he-1610-"; // // Bare bruk databasen der den trengs // refreshAppearance(false, true, true); // _isNaked = true; // } // else // { // refreshAppearance(true, true, true); // _isNaked = false; // } // break; // } //#endregion #region :roomalert case "roomalert": // Alert all virtual users in current virtual room { if (_Rank == 5 || _Rank == 5) // VIP { if (_isOwner) { string Message = Text.Substring(10); Room.sendData("BK" + "Melding fra romeier:
" + Message);// } } else if (rankManager.containsRight(_Rank, "fuse_room_alert")) //phpmyadmin { string Message = Text.Substring(10); Room.sendData("B!" + Message + Convert.ToChar(2)); staffManager.addStaffMessage("ralert", userID, Room.roomID, Message, ""); } else { FuseBuilder Response = new FuseBuilder(139); // "BK" - alert Response.Append("Du må være VIP level 2 og eier av rommet for å bruke denne kommandoen!"); sendData(Response); return false; } break; } #endregion #endregion #region Moderacy commands #region :shutup/:unmute case "shutup": // Mutes a virtual user (disabling it from chat) { if (rankManager.containsRight(_Rank, "fuse_mute") == false) return false; else { virtualUser Target = userManager.getUser(args[1]); if (Target._Rank < _Rank && Target._isMuted == false) { string Message = stringManager.wrapParameters(args, 2); Target._isMuted = true; Target.sendData("BK" + stringManager.getString("scommand_muted") + "\r" + Message); sendData("BK" + stringManager.getString("scommand_success")); staffManager.addStaffMessage("mute", userID, Target.userID, Message, ""); } else sendData("BK" + stringManager.getString("scommand_failed")); } break; } case "unmute": // Unmutes a virtual user (enabling it to chat again) { if (rankManager.containsRight(_Rank, "fuse_mute") == false) return false; else { virtualUser Target = userManager.getUser(args[1]); if (Target._Rank < _Rank && Target._isMuted) { Target._isMuted = false; Target.sendData("BK" + stringManager.getString("scommand_unmuted")); sendData("BK" + stringManager.getString("scommand_success")); staffManager.addStaffMessage("unmute", userID, Target.userID, "", ""); } else sendData("BK" + stringManager.getString("scommand_failed")); } break; } #endregion #region :roomshutup/:roomunmute case "roomshutup": // Mutes all virtual users in the current room from chat. Only user's that have a lower rank than this user are affected. { if (rankManager.containsRight(_Rank, "fuse_room_mute") == false) return false; else { string Message = stringManager.wrapParameters(args, 1); Room.muteUsers(_Rank, Message); sendData("BK" + stringManager.getString("scommand_success")); staffManager.addStaffMessage("rmute", userID, Room.roomID, Message, ""); } break; } case "roomunmute": // Unmutes all the muted virtual users in this room (who's rank is lower than this user's rank), making them able to chat again { if (rankManager.containsRight(_Rank, "fuse_room_mute") == false) return false; else { Room.unmuteUsers(_Rank); sendData("BK" + stringManager.getString("scommand_success")); staffManager.addStaffMessage("runmute", userID, Room.roomID, "", ""); } break; } #endregion #region :ban/:superban case "ban": // Bans a virtual user from server (no IP ban) { if (rankManager.containsRight(_Rank, "fuse_ban") == false) return false; else { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", args[1]); dRow = dbClient.ReadDataRow("SELECT id,rank FROM users WHERE name = @name"); } if (dRow.Table.Rows.Count == 0) sendData("BK" + stringManager.getString("modtool_actionfailed") + "\r" + stringManager.getString("modtool_usernotfound")); else if (Convert.ToByte(dRow["rank"]) > _Rank) sendData("BK" + stringManager.getString("modtool_actionfailed") + "\r" + stringManager.getString("modtool_rankerror")); else { int banHours = int.Parse(args[2]); string Reason = stringManager.wrapParameters(args, 3); if (banHours == 0 || Reason == "") sendData("BK" + stringManager.getString("scommand_failed")); else { staffManager.addStaffMessage("ban", userID, Convert.ToInt32(dRow["id"]), Reason, ""); userManager.setBan(Convert.ToInt32(dRow["id"]), banHours, Reason); sendData("BK" + userManager.generateBanReport(Convert.ToInt32(dRow["id"]))); } } } break; } case "superban": // Bans an IP address and all virtual user's that used this IP address for their last access from the system { if (rankManager.containsRight(_Rank, "fuse_superban") == false) return false; else { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", args[1]); dRow = dbClient.ReadDataRow("SELECT id,rank,ipaddress_last FROM users WHERE name = @name"); } if (dRow.Table.Rows.Count == 0) sendData("BK" + stringManager.getString("modtool_actionfailed") + "\r" + stringManager.getString("modtool_usernotfound")); else if (Convert.ToByte(dRow["rank"]) > _Rank) sendData("BK" + stringManager.getString("modtool_actionfailed") + "\r" + stringManager.getString("modtool_rankerror")); else { int banHours = int.Parse(args[2]); string Reason = stringManager.wrapParameters(args, 3); if (banHours == 0 || Reason == "") sendData("BK" + stringManager.getString("scommand_failed")); else { string IP = Convert.ToString(dRow["ipaddress_last"]); staffManager.addStaffMessage("superban", userID, Convert.ToInt32(dRow["id"]), Reason, ""); userManager.setBan(IP, banHours, Reason); sendData("BK" + userManager.generateBanReport(IP)); } } } break; } #endregion #endregion #region Message broadcoasting #region :hw case "ha": // Broadcoasts a message to all virtual users (hotel alert) case "hw": case "hotelalert": // Broadcoasts a message to all virtual users (hotel alert) { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; else { string Message = Text.Substring(3); userManager.sendData("BK" + stringManager.getString("scommand_hotelalert") + "\r" + Message); staffManager.addStaffMessage("halert", userID, 0, Message, ""); } } break; #endregion #region :offline case "offline": // Broadcoasts a message that the server will shutdown in xx minutes { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == false) return false; else { int Minutes = int.Parse(args[1]); userManager.sendData("Dc" + Encoding.encodeVL64(Minutes)); staffManager.addStaffMessage("offline", userID, 0, "mm=" + Minutes, ""); } break; } #endregion #endregion #region :infobus case "infobus": { if (rankManager.containsRight(_Rank, "fuse_administrator_access") == true) { FuseBuilder Message = new FuseBuilder(79); // "AO" SortedList Questions = new SortedList(); string Title; DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { Title = dbClient.ReadString("SELECT question from infobus WHERE id = 0"); dTable = dbClient.ReadDataTable("SELECT id, question FROM infobus"); } Message.AppendString(Title, 13); foreach (DataRow dRow in dTable.Rows) { Questions.Add(int.Parse(dRow["id"].ToString()), dRow["question"].ToString()); } Questions.Remove(0); // Remove title int i = 0; int Char = 13; foreach (string Question in Questions.Values) { i++; if (i == Questions.Count) Char = 2; Message.AppendString(i, ':'); Message.AppendString(Question, Char); } Room.InfobusPoll_answers = new int[Questions.Count]; Room.sendData(Message.ToString());//"AO" + question_tittel + Convert.ToChar(13) + "1:" + question_1 + Convert.ToChar(13) + "2:" + question_2 + Convert.ToChar(13) + "3:" + question_3 + Convert.ToChar(13) + "4:" + question_4 + Convert.ToChar(13) + "5:" + question_5 + Convert.ToChar(13) + "6:" + question_6 + Convert.ToChar(2)); Thread InfobusStopper = new Thread(Room.InfobusStop); InfobusStopper.Priority = ThreadPriority.Lowest; InfobusStopper.Start(); } break; } #endregion default: return false; } } catch { sendData("BK" + stringManager.getString("scommand_failed")); } return true; } private delegate void TeleporterUsageSleep(Rooms.Items.floorItem Teleporter1, int idTeleporter2, int roomIDTeleporter2); private void useTeleporter(Rooms.Items.floorItem Teleporter1, int idTeleporter2, int roomIDTeleporter2) { roomUser.walkLock = true; string Sprite = Teleporter1.Sprite; if (roomIDTeleporter2 == _roomID) // Partner teleporter is in same room, don't leave room { Rooms.Items.floorItem Teleporter2 = Room.floorItemManager.getItem(idTeleporter2); Thread.Sleep(500); Room.sendData("AY" + Teleporter1.ID + "/" + _Username + "/" + Sprite); //Thread.Sleep(1000); Room.sendData(@"A\" + Teleporter2.ID + "/" + _Username + "/" + Sprite); roomUser.X = Teleporter2.X; roomUser.Y = Teleporter2.Y; roomUser.H = Teleporter2.H; roomUser.Z1 = Teleporter2.Z; roomUser.Z2 = Teleporter2.Z; roomUser.Refresh(); roomUser.walkLock = false; } else // Partner teleporter is in different room { _teleporterID = idTeleporter2; sendData("@~" + Encoding.encodeVL64(idTeleporter2) + Encoding.encodeVL64(roomIDTeleporter2)); Room.sendData("AY" + Teleporter1.ID + "/" + _Username + "/" + Sprite); } } #endregion } }