using System; using System.Data; 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 Holo.Virtual.Rooms.Games; using Holo.Virtual; using Microsoft.VisualBasic; using System.Collections.Generic; using Holo.Source.Managers; using Ion.Storage; using Holo.Source.GameConnectionSystem; using Holo.Source.Socket_servers.Game_Socketsystem; using Holo.Socketservers; using Sec.cct; using Holo.Source.Managers.User; using Microsoft.VisualBasic.ApplicationServices; 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 { internal bool generatedOwnRooms = false; internal bool ownRoomsUpdated = true; bool on = false; private gameConnection _ConnectionManager; private messageHandler Handler; internal bool pingOK; /// /// 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; /// /// Specifies if the client is disconnected already. /// internal 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. /// public bool _isLoggedIn; /// /// The room user ID (rUID) of the virtual user where this virtual user is currently trading items with. If not trading, then this value is -1. /// internal int _tradePartnerRoomUID = -1; /// 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; /// /// The v26 badge system. /// internal List _Badges = new List(); internal List _badgeSlotIDs = new List(); 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; /// /// Variant of virtualRoomUser object. Represents this virtual user in a game arena, aswell as in a game team in the navigator. /// internal gamePlayer gamePlayer; #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 _Pixels; internal int _Minuteperiod; internal int _Tickets; internal int Respect; internal System.Collections.Generic.List _fuserights; internal string Ipaddress = ""; internal bool _clubMember; internal bool _isOwner; internal bool _hasRights; internal bool _isMuted; internal bool _blockCFH; internal bool _activateBuy; internal int _groupID; internal int _groupMemberRank; internal int _tradePartnerUID = -1; internal bool _tradeAccept; internal bool _tradeConfirm; internal int[] _tradeItems = new int[65]; internal int _tradeItemCount; internal bool _isGuide; internal bool _guideSearch; internal int _guideFinish; internal int _guideRequest; internal int _guideRoom; internal int _guideCount; internal string _mutedIDs; internal int _teleporterID; internal int _teleporterRoomID; internal int _maxFriends; public bool nameChanged = false; #endregion #region SystemStuff internal bool _clean; internal bool _stackRugs; internal bool _noHeightLimit; internal bool _hostsEvent; internal string statusID; internal int statusCount; internal int _roomID; internal bool _inPublicroom; internal bool _ROOMACCESS_PRIMARY_OK; internal bool _ROOMACCESS_SECONDARY_OK; internal string currentPacket; internal string spawnStatus = ""; internal Rooms.Pathfinding.Coord[] spawnLoc = new Rooms.Pathfinding.Coord[2] { new Rooms.Pathfinding.Coord(-1, -1), new Rooms.Pathfinding.Coord(-1, -1) }; private virtualSongEditor songEditor; private Thread brbLooper; private Thread jailLooper; private Thread jailBreakLooper; private Thread workLooper; private Thread cdLooper; private Thread punchCdLooper; private Thread pushCdLooper; private Thread copCdLooper; private Thread deadLooper; private Thread workoutLooper; private Thread workoutDosLooper; private bool RegisteredPackets = false; #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(gameConnection ConnectionManager) { this._ConnectionManager = ConnectionManager; } ~virtualUser() { if (_isDisconnected == false) Disconnect(); GC.Collect(); } #endregion #region Connection management /// /// Immediately completes the current data transfer [if any], disconnects the client and flags the connection slot as free. /// public void Reset() { if (_isDisconnected == false) { try { _isDisconnected = true; leaveCurrentRoom("", false); if (Messenger != null) Messenger.Clear(); userManager.removeUser(userID); } catch (Exception e) { Out.WriteDCError("FATAL ERROR DURING DISCONNECTION:\r" + e.ToString()); } } } internal void Disconnect() { _ConnectionManager.Close(); } /// /// 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) { Thread.Sleep(ms); Disconnect(); } /// /// Returns the IP address of this connection as a string. /// #endregion internal void sendData(string packet) { _ConnectionManager.sendData(packet); } internal void SetHandler(messageHandler _Handler) { this.Handler = _Handler; } public string IP { get { return _ConnectionManager.connectionRemoteIP; } } #region Packet processing /// /// Processes a single packet from the client. /// /// The packet to process. #region Non-logged in packet processing // Ways to switch from VOIDS -> CASES //switch(currentPacket.subString(0,2)); internal void ProcessPacketCD() { pingOK = true; _ConnectionManager.Pinged(); } internal void ProcessPacketCN() { sendData("DUH"); } internal void ProcessPacket_R() { sendData("DA" + "QBHIIIKHJIPAIQAdd-MM-yyyy" + Convert.ToChar(2) + "SAHPB/client" + Convert.ToChar(2) + "QBH" + "IJWVVVSNKQCFUBJASMSLKUUOJCOLJQPNSBIRSVQBRXZQOTGPMNJIHLVJCRRULBLUO"); // V25+ SSO LOGIN BY vista4life } internal void ProcessPacketRR() { sendData("YDAAX" + "http://hotel-nl.holo-hotel.co.uk/dcr/r36_20090630_0501_18816_a9e9d9ea454515efb391924f2c1fa9b9/" + "An" + "http://hotel-nl.holo-hotel.co.uk/gamedata/external?id=external_variables&hash=e171b6e6e96cab5963cdf7e6584062fd4042d61c"); } internal void ProcessPacketapeF() { sendData("Fw" + "7b2bb491cfaa4d2abe0494fa466371130001194b691579c1e6193afdaa227db7031a47c9f2c3" + Convert.ToChar(2) + Convert.ToChar(1)); } internal void ProcessPacketCL() { int myID = 0; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("sso", currentPacket.Substring(4)); myID = dbClient.getInt("SELECT id FROM users WHERE ticket_sso = @sso LIMIT 1"); } if (myID == 0) // No user found for this sso ticket and/or IP address { Disconnect(); return; } string banReason = userManager.getBanReason(myID); if (banReason != "") { sendData("@c" + banReason); Disconnect(1000); return; } this.userID = myID; DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT name,figure,sex,mission,rank,guide FROM users WHERE id = '" + this.userID + "'"); } _Username = Convert.ToString(dRow[0]); _Figure = Convert.ToString(dRow[1]); _Sex = Convert.ToChar(dRow[2]); _Mission = Convert.ToString(dRow[3]); _Rank = Convert.ToByte(dRow[4]); int intGuide = Convert.ToInt16(dRow[5]); _stackRugs = true; _noHeightLimit = false; userManager.addUser(myID, this); _isLoggedIn = true; string today = DateTime.Today.ToString(); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (!dbClient.findsResult("SELECT dailyrespect FROM users WHERE id = '" + userID + "' AND dailyrespect = '" + today + "'")) { dbClient.runQuery("UPDATE users SET dailyrespect = '" + today + "' AND respect_left = 3 WHERE id = " + userID); Respect = 3; } else Respect = dbClient.getInt("SELECT respect_left FROM users WHERE id = " + userID); } this._fuserights = FuserightManager.GenerateFuseList(this.userID); sendData("@B" + rankManager.fuseRights(this)); //No more DC at login! ;D using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { //resets everything to zero just incase dbClient.runQuery("UPDATE users SET working = '0' WHERE name = '" + _Username + "'"); dbClient.runQuery("UPDATE users SET working_out = '0' WHERE name = '" + _Username + "'"); dbClient.runQuery("UPDATE users SET afk = '0' WHERE name = '" + _Username + "'"); //gets information from the database int onloadroom = dbClient.getInt("SELECT onloadroom FROM users WHERE name = '" + _Username + "'"); int isarrested = dbClient.getInt("SELECT arrested FROM users WHERE name = '" + _Username + "'"); int dead = dbClient.getInt("SELECT dead FROM users WHERE name = '" + _Username + "'"); if (isarrested == 1 || dead == 1) { if (isarrested == 1) { //sends user back to jail sendData("D^" + "H" + Encoding.encodeVL64(1)); sendData("BK" + "You logged out while you were arrested.\r\rTherefore you MUST reset your jail timer by using the folowing command:\r:jailtimer\r\rThis will restart your jail timer to where you left off last login." + Convert.ToChar(2)); _Figure = "hd-190-1.ch-220-94.lg-280-94.sh-290-62.hr-125-61"; _Mission = "[Jailed] Convict"; refreshAppearance(false, true, true); } else { //sends user back to the hospital sendData("D^" + "H" + Encoding.encodeVL64(168)); sendData("BK" + "You logged out while you were dead.\r\rTherefore you MUST reset your dead timer by using the folowing command:\r:deadtimer\r\rThis will restart your dead timer to where you left off last login." + Convert.ToChar(2)); _Mission = "Dead"; refreshAppearance(false, true, true); } } else { sendData("D^" + "H" + Encoding.encodeVL64(onloadroom)); } } { // Guide tool this._guideRequest = -1; this._guideRoom = -1; this._guideCount = -1; this._guideSearch = false; this._guideFinish = -1; sendData("Fi" + Encoding.encodeVL64(intGuide)); if (intGuide == 1) this._isGuide = true; else this._isGuide = false; sendData("FC"); // Messenger maximal friends Cache this! _maxFriends = Config.GetMaxFriends; } sendData("FdH"); sendData("DbIH"); sendData("@C"); sendData("GGH" + Convert.ToChar(2)); if (Config.enableWelcomeMessage) sendData("BK" + "Welcome to HabbzaRP. Rev36 Server developed by Dominicc. Follow HabbzaRP on twitter: @HabbzaRP" + Convert.ToChar(2)); if (!RegisteredPackets) Handler.RegisterLoggedInPackets(); RegisteredPackets = true; Handler.DestroyStandardPackets(); } #endregion #region Logged-in packet processing #region Misc internal void ProcessPacketCD21() // Client - response to @r ping CD { if (_guideFinish > -1) { _guideFinish++; if (_guideFinish == 2) { if (_guideCount > 0) sendData("EeI"); else sendData("Ee"); Handler.ProcessPacket("Eg"); } } pingOK = true; _ConnectionManager.Pinged(); } internal void ProcessPacketAGq() // Client - request current date @q { sendData("Bc" + DateTime.Today.ToShortDateString()); } internal void ProcessPacketBA() // Purse - redeem credit voucher BA { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("code", currentPacket.Substring(4)); if (dbClient.findsResult("SELECT credits FROM vouchers WHERE voucher = @code")) { int voucherAmount = dbClient.getInt("SELECT credits FROM vouchers WHERE voucher = @code"); dbClient.runQuery("DELETE FROM vouchers WHERE voucher = @code LIMIT 1"); _Credits += voucherAmount; sendData("@F" + _Credits); sendData("CT"); dbClient.runQuery("UPDATE users SET credits = '" + voucherAmount + "' WHERE id = '" + userID + "' LIMIT 1"); } else sendData("CU1" + Convert.ToChar(2)); } } #endregion #region Login internal void ProcessPacketAGL() // Login - initialize messenger @L { Messenger = new Messenger.virtualMessenger(userID); sendData("@L" + Messenger.friendList(_maxFriends)); sendData("Dz" + Messenger.friendRequests()); } internal void ProcessPacketAGZ() // Login - initialize Club subscription status @Z { refreshClub(); } internal void ProcessPacketAGG() // Login - initialize/refresh appearance @G { refreshAppearance(false, true, false); } internal void ProcessPacketAGH() // Login - initialize/refresh valueables [credits, tickets, etc] @H { refreshValueables(true, true); } internal void ProcessPacketBS9() // Login - initialize/refresh badges B] { refreshBadges(); } internal void ProcessPacketCd() // Login - initialize/refresh group status { refreshGroupStatus(); } internal void ProcessPacketEr() // Login - initialize/refresh effects { refreshEffect(); } internal void ProcessPacketDm() // Login - intialize welcomer status { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.getInt("SELECT guide_allowed FROM users WHERE id = " + userID) == 1) { sendData("E`" + "PBIJKPAQARASAPB"); sendData("GJ" + "RGK"); } } } #endregion #region Messenger internal void ProcessPacketAGg() // Messenger - request user as friend @g { if (Messenger != null) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("username", currentPacket.Substring(4)); int toID = dbClient.getInt("SELECT id FROM users WHERE name = @username"); int requestID = dbClient.getInt("SELECT MAX(requestid) FROM messenger_friendrequests WHERE userid_to = '" + toID + "'") + 1; dbClient.runQuery("INSERT INTO messenger_friendrequests(userid_to,userid_from,requestid) VALUES ('" + toID + "','" + userID + "','" + requestID + "')"); if (userManager.getUser(toID) != null) userManager.getUser(toID).sendData("BD" + "I" + _Username + Convert.ToChar(2) + userID + Convert.ToChar(2)); } } } internal void ProcessPacketAGi() // Search in console @i { //Variables string Packet = "Fs"; string PacketFriends = ""; string PacketOthers = ""; string PacketAdd = ""; int CountFriends = 0; int CountOthers = 0; // Database string[] IDs; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { string Search = currentPacket.Substring(4); Search = Search.Replace(@"\", "\\").Replace("'", @"\'"); dbClient.AddParamWithValue("search", Search); IDs = dataHandling.dColToArray((dbClient.getColumn("SELECT id FROM users WHERE name LIKE '" + Search + "%' LIMIT 20 "))); } // Loop through results for (int i = 0; i < IDs.Length; i++) { int thisID = Convert.ToInt32(IDs[i]); bool online = userManager.containsUser(thisID); string onlineStr = online ? "I" : "H"; DataRow row; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { row = dbClient.getRow("SELECT name, mission, lastvisit, figure FROM users WHERE id = " + thisID.ToString()); } PacketAdd = Encoding.encodeVL64(thisID) + row[0] + "" + row[1] + "" + onlineStr + onlineStr + "" + onlineStr + (online ? row[3] : "") + "" + (online ? "" : row[2]) + ""; // Friend or not? if (Messenger.hasFriendship(thisID)) { CountFriends += 1; PacketFriends += PacketAdd; } else { CountOthers += 1; PacketOthers += PacketAdd; } } // Add count headers PacketFriends = Encoding.encodeVL64(CountFriends) + PacketFriends; PacketOthers = Encoding.encodeVL64(CountOthers) + PacketOthers; // Merge packets Packet += PacketFriends + PacketOthers; // Send packets sendData(Packet); } internal void ProcessPacketAGe() // Messenger - accept friendrequest(s) @e { if (Messenger != null) { int Amount = Encoding.decodeVL64(currentPacket.Substring(2)); currentPacket = currentPacket.Substring(Encoding.encodeVL64(Amount).Length + 2); StringBuilder Updates = new StringBuilder(); virtualBuddy Me = new virtualBuddy(userID); for (int i = 0; i < Amount; i++) { if (currentPacket == "") { return; } int requestID = Encoding.decodeVL64(currentPacket); int fromUserID = 0; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.getInt("SELECT COUNT(friendid) FROM messenger_friendrequests WHERE userid = '" + this.userID + "'") > this._maxFriends) return; if (this.userID > 0 && requestID > 0) fromUserID = dbClient.getInt("SELECT userid_from FROM messenger_friendrequests WHERE userid_to = '" + this.userID + "' AND requestid = '" + requestID + "'"); } if (fromUserID > 0) { virtualBuddy Buddy = new virtualBuddy(fromUserID); Messenger.addBuddy(Buddy, false); if (userManager.containsUser(fromUserID)) { if (userManager.getUser(fromUserID).Messenger != null) userManager.getUser(fromUserID).Messenger.addBuddy(Me, true); } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("INSERT INTO messenger_friendships(userid,friendid) VALUES ('" + fromUserID + "','" + this.userID + "')"); dbClient.runQuery("DELETE FROM messenger_friendrequests WHERE userid_to = '" + this.userID + "' AND requestid = '" + requestID + "' LIMIT 1"); } sendData("@M" + "HI" + Encoding.encodeVL64(1) + Buddy.ToString(true, false)); currentPacket = currentPacket.Substring(Encoding.encodeVL64(requestID).Length); } } } return; } internal void ProcessPacketAGf() // Messenger - decline friendrequests @f { if (Messenger != null) { int Amount = Encoding.decodeVL64(currentPacket.Substring(3)); currentPacket = currentPacket.Substring(Encoding.encodeVL64(Amount).Length + 3); for (int i = 0; i < Amount; i++) { if (currentPacket == "") { return; } int requestID = Encoding.decodeVL64(currentPacket); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM messenger_friendrequests WHERE userid_to = '" + this.userID + "' AND requestid = '" + requestID + "' LIMIT 1"); } currentPacket = currentPacket.Substring(Encoding.encodeVL64(requestID).Length); } } } internal void ProcessPacketAGh() // Messenger - remove buddy from friendlist @h { if (Messenger != null) { int buddyID = Encoding.decodeVL64(currentPacket.Substring(3)); Messenger.removeBuddy(buddyID); if (userManager.containsUser(buddyID)) { if (userManager.getUser(buddyID).Messenger != null) userManager.getUser(buddyID).Messenger.removeBuddy(userID); } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM messenger_friendships WHERE (userid = '" + userID + "' AND friendid = '" + buddyID + "') OR (userid = '" + buddyID + "' AND friendid = '" + userID + "') LIMIT 1"); } } } internal void ProcessPacketAGa() // Messenger - send instant message to buddy @a { 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)); } } internal void ProcessPacketAGO() // Messenger - refresh friendlist @O { if (Messenger != null) sendData("@M" + Messenger.getUpdates()); } internal void ProcessPacketAGb() // Messenger - invite buddies to your room @b { try { 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++) if (userManager.containsUser(IDs[i])) userManager.getUser(IDs[i]).sendData(Data); } } catch { sendData("BKSorry something went wrong during sending the invites."); } } #endregion #region Navigator actions internal void ProcessPacketBV() // Navigator - navigate through rooms and categories { if (_Rank < 6) { //sendData("BK" + "Nooo"); } else { int hideFull = Encoding.decodeVL64(currentPacket.Substring(2, 1)); int cataID = Encoding.decodeVL64(currentPacket.Substring(3)); string Name = navigatorManager.getNameAcces(_Rank, cataID); //editted for caching if (Name == "") // User has no access to this category/it does not exist { return; } int Type = navigatorManager.getType(cataID); int parentID = navigatorManager.getParent(cataID); StringBuilder Navigator = new StringBuilder(@"C\" + Encoding.encodeVL64(hideFull) + Encoding.encodeVL64(cataID) + Encoding.encodeVL64(Type) + Name + Convert.ToChar(2) + Encoding.encodeVL64(0) + Encoding.encodeVL64(10000) + Encoding.encodeVL64(parentID)); string _SQL_ORDER_HELPER = ""; if (Type == 0) // Publicrooms { if (hideFull == 1) _SQL_ORDER_HELPER = "AND visitors_now < visitors_max ORDER BY id ASC"; else _SQL_ORDER_HELPER = "ORDER BY id ASC"; } else // Guestrooms { if (hideFull == 1) _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; } DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT id,state,showname,visitors_now,visitors_max,name,description,owner,ccts FROM rooms WHERE category = '" + cataID + "' " + _SQL_ORDER_HELPER); } if (Type == 2) // Guestrooms Navigator.Append(Encoding.encodeVL64(dTable.Rows.Count)); bool canSeeHiddenNames = false; if (Type != 0) // Publicroom canSeeHiddenNames = rankManager.containsRight(this, "fuse_enter_locked_rooms", userID); foreach (DataRow dRow in dTable.Rows) { if (Type == 0) Navigator.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + "I" + Convert.ToString(dRow["name"]) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_now"])) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_max"])) + Encoding.encodeVL64(cataID) + Convert.ToString(dRow["description"]) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + "H" + Convert.ToString(dRow["ccts"]) + Convert.ToChar(2) + "HI"); else { if (Convert.ToInt32(dRow["showname"]) == 0 && canSeeHiddenNames == false) continue; else Navigator.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + Convert.ToString(dRow["name"]) + Convert.ToChar(2) + Convert.ToString(dRow["owner"]) + Convert.ToChar(2) + roomManager.getRoomState(Convert.ToInt32(dRow["state"])) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_now"])) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_max"])) + Convert.ToString(dRow["description"]) + Convert.ToChar(2)); } } //working on DataColumn dCol = navigatorManager.getAccesParent(_Rank, cataID); if (dCol.Table.Rows.Count > 0) // Sub categories { StringBuilder sb = new StringBuilder(); List emptyIDs = new List(); foreach (DataRow dRow in dCol.Table.Rows) { sb.Append(" OR category = '" + Convert.ToString(dRow[0]) + "'"); emptyIDs.Add(Convert.ToInt32(dRow[0])); } dTable = navigatorManager.getGuestroomQuery("SELECT SUM(visitors_now),SUM(visitors_max),category FROM rooms WHERE" + sb.ToString().Substring(3) + " GROUP BY category", false); foreach (DataRow dRow in dTable.Rows) { if (Convert.ToInt32(dRow[1]) > 0 && hideFull == 1 && Convert.ToInt32(dRow[0]) >= Convert.ToInt32(dRow[1])) continue; Navigator.Append(Encoding.encodeVL64(Convert.ToInt32(dRow[2])) + "H" + navigatorManager.getName(Convert.ToInt32(dRow[2])) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow[0])) + Encoding.encodeVL64(Convert.ToInt32(dRow[1])) + Encoding.encodeVL64(cataID)); emptyIDs.Remove(Convert.ToInt32(dRow[2])); } foreach (int emptyID in emptyIDs) Navigator.Append(Encoding.encodeVL64(emptyID) + "H" + navigatorManager.getName(emptyID) + Convert.ToChar(2) + "HH" + Encoding.encodeVL64(cataID)); } sendData(Navigator.ToString()); } } internal void ProcessPacketBW() // Navigator - request index of categories to place guestroom on { if (_Rank < 6) { //sendData("BK" + "Nooo"); } else { StringBuilder Categories = new StringBuilder(); DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT id,name FROM room_categories WHERE type = '2' AND parent > 0 AND access_rank_min <= " + _Rank); } foreach (DataRow dRow in dTable.Rows) Categories.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + dRow["name"] + Convert.ToChar(2)); sendData("C]" + Encoding.encodeVL64(dTable.Rows.Count) + Categories.ToString()); } } internal void ProcessPacketDH() // Navigator - refresh recommended rooms (random guestrooms) { if (_Rank < 6) { //sendData("BK" + "Nooo"); } else { sendData("E_" + Encoding.encodeVL64(3) + navigatorManager.getRandomRooms()); } } internal void ProcessPacketAGP() // Navigator - view user's own guestrooms @P { if (_Rank < 6) { //sendData("BK" + "Nooo"); } else { DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT id,name,description,state,showname,visitors_now,visitors_max FROM rooms WHERE owner = '" + _Username + "' ORDER BY id ASC"); } if (dTable.Rows.Count > 0) { StringBuilder Rooms = new StringBuilder(); foreach (DataRow dRow in dTable.Rows) Rooms.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + Convert.ToString(dRow["name"]) + Convert.ToChar(2) + _Username + Convert.ToChar(2) + roomManager.getRoomState(Convert.ToInt32(dRow["state"])) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_now"])) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_max"])) + Convert.ToString(dRow["description"]) + Convert.ToChar(2)); sendData("@P" + Encoding.encodeVL64(dTable.Rows.Count) + Rooms.ToString()); } else { sendData("@y" + _Username); } } } internal void ProcessPacketAGQ() // Navigator - perform guestroom search on name/owner with a given criticeria @Q { if (_Rank < 6) { //sendData("BK" + "Nooo"); } else { int countRooms = 0; bool seeAllRoomOwners = rankManager.containsRight(this, "fuse_see_all_roomowners", userID); DataTable dTable; StringBuilder Rooms = new StringBuilder(); string nameString; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("search", currentPacket.Substring(4)); dbClient.AddParamWithValue("max", Config.Navigator_roomSearch_maxResults); dTable = dbClient.getTable("SELECT id,name,owner,description,state,showname,visitors_now,visitors_max FROM rooms WHERE (owner = @search) ORDER BY id ASC LIMIT @max"); } if (dTable.Rows.Count > 0) { foreach (DataRow dRow in dTable.Rows) { nameString = Convert.ToString(dRow["owner"]); if (Convert.ToString(dRow["showname"]) == "0" && Convert.ToString(dRow["owner"]) != _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 } else { Rooms.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + Convert.ToString(dRow["name"]) + Convert.ToChar(2) + Convert.ToString(dRow["owner"]) + Convert.ToChar(2) + roomManager.getRoomState(Convert.ToInt32(dRow["state"])) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_now"])) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_max"])) + Convert.ToString(dRow["description"]) + Convert.ToChar(2)); countRooms++; } } } // Now find room names like search query and add them to the result - Done by Hebbo using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("max", Config.Navigator_roomSearch_maxResults - countRooms); dTable = dbClient.getTable("SELECT id,name,owner,description,state,showname,visitors_now,visitors_max FROM rooms WHERE (owner != '' AND name LIKE '" + currentPacket.Substring(4).Replace("'", "''") + "%') ORDER BY id ASC LIMIT @max"); } if (dTable.Rows.Count > 0) { foreach (DataRow dRow in dTable.Rows) { nameString = Convert.ToString(dRow["owner"]); if (Convert.ToString(dRow["showname"]) == "0" && Convert.ToString(dRow["owner"]) != _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 } else { Rooms.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + Convert.ToString(dRow["name"]) + Convert.ToChar(2) + Convert.ToString(dRow["owner"]) + Convert.ToChar(2) + roomManager.getRoomState(Convert.ToInt32(dRow["state"])) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_now"])) + Encoding.encodeVL64(Convert.ToInt32(dRow["visitors_max"])) + Convert.ToString(dRow["description"]) + Convert.ToChar(2)); countRooms++; } } } if (countRooms == 0) sendData("@z"); else sendData("@w" + Encoding.encodeVL64(countRooms) + Rooms.ToString()); } } internal void ProcessPacketAGU() // Navigator - get guestroom details @U { int roomID = Encoding.decodeVL64(currentPacket.Substring(2)); DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT name,owner,description,model,state,superusers,showname,category,visitors_now,visitors_max FROM rooms WHERE id = '" + roomID + "' AND NOT(owner IS NULL)"); } if (dRow.Table.Rows.Count > 0) // Guestroom does exist { StringBuilder Details = new StringBuilder(Encoding.encodeVL64(Convert.ToInt32(dRow[5])) + Encoding.encodeVL64(Convert.ToInt32(dRow[4])) + Encoding.encodeVL64(roomID)); if (Convert.ToString(dRow[1]) != _Username && Convert.ToString(dRow[6]) == "0" && rankManager.containsRight(this, "fuse_see_all_roomowners", userID)) // 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 Details.Append("-"); else Details.Append(Convert.ToString(dRow[1])); Details.Append(Convert.ToChar(2) + "model_" + Convert.ToString(dRow[3]) + Convert.ToChar(2) + Convert.ToString(dRow[0]) + Convert.ToChar(2) + Convert.ToString(dRow[2]) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow[6]))); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT id FROM room_categories WHERE id = '" + Convert.ToString(dRow[7]) + "' AND trading = '1'")) Details.Append("I"); // Allow trading else Details.Append("H"); // Disallow trading } Details.Append(Encoding.encodeVL64(Convert.ToInt32(dRow[8])) + Encoding.encodeVL64(Convert.ToInt32(dRow[9]))); sendData("@v" + Details.ToString()); } } internal void ProcessPacketAGR() // Navigator - initialize user's favorite rooms @R { //Database dbClient = new Database(true, false, 152); if (_Rank < 6) { //sendData("BK" + "Nooo"); } else { DataColumn dCol; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dCol = dbClient.getColumn("SELECT roomid FROM users_favourites WHERE userid = '" + userID + "' ORDER BY roomid DESC LIMIT " + Config.Navigator_Favourites_maxRooms); } System.Collections.Hashtable deletedIDs = new System.Collections.Hashtable(dCol.Table.Rows.Count); string roomIDs = " "; foreach (DataRow dRow in dCol.Table.Rows) { deletedIDs.Add(Convert.ToInt32(dRow["roomid"]), Convert.ToInt32(dRow["roomid"])); roomIDs += "id = '" + Convert.ToString(dRow["roomid"]) + "' OR "; } roomIDs = roomIDs.Substring(0, roomIDs.Length - 4); if (roomIDs.Length > 0) { int guestRoomAmount = 0; string nameString; bool seeHiddenRoomOwners = rankManager.containsRight(this, "fuse_enter_locked_rooms", userID); StringBuilder Rooms = new StringBuilder(); DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT name,owner,state,showname,visitors_now,visitors_max,description,category,ccts,id FROM rooms WHERE " + roomIDs); } foreach (DataRow dRow in dTable.Rows) { deletedIDs.Remove(Convert.ToInt32(dRow["id"])); if (Convert.ToString(dRow[1]) == "") Rooms.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + "I" + Convert.ToString(dRow[0]) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow[4])) + Encoding.encodeVL64(Convert.ToInt32(dRow[5])) + Encoding.encodeVL64(Convert.ToInt32(dRow[7])) + Convert.ToString(dRow[6]) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + "H" + Convert.ToString(dRow[8]) + Convert.ToChar(2) + "HI"); else // Guestroom { nameString = Convert.ToString(dRow[0]); if (Convert.ToString(dRow[3]) == "0" && _Username != Convert.ToString(dRow[1]) && seeHiddenRoomOwners == 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 '-' nameString = "-"; Rooms.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + nameString + Convert.ToChar(2) + Convert.ToString(dRow[1]) + Convert.ToChar(2) + roomManager.getRoomState(Convert.ToInt32(dRow[2])) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow[4])) + Encoding.encodeVL64(Convert.ToInt32(dRow[5])) + Convert.ToString(dRow[6]) + Convert.ToChar(2)); guestRoomAmount++; } } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { foreach (int rID in deletedIDs.Values) dbClient.runQuery("DELETE FROM users_favourites WHERE roomid = '" + rID + "' LIMIT 1"); } sendData("@}" + "HHJ" + Convert.ToChar(2) + "HHH" + Encoding.encodeVL64(guestRoomAmount - deletedIDs.Count) + Rooms.ToString()); } } } internal void ProcessPacketAGS() // Navigator - add room to favourite rooms list @S { if (_Rank < 6) { //sendData("BK" + "Nooo"); } else { int roomID = Encoding.decodeVL64(currentPacket.Substring(3)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT id FROM rooms WHERE id = '" + roomID + "'") == true && dbClient.findsResult("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.getInt("SELECT COUNT(userid) FROM users_favourites WHERE userid = '" + userID + "'") < Config.Navigator_Favourites_maxRooms) { sendData("GK" + Encoding.encodeVL64(roomID) + "I"); dbClient.runQuery("INSERT INTO users_favourites (userid,roomid) VALUES ('" + userID + "','" + roomID + "')"); } else sendData("@a" + "nav_error_toomanyfavrooms"); } } } } internal void ProcessPacketAGT() // Navigator - remove room from favourite rooms list @T { int roomID = Encoding.decodeVL64(currentPacket.Substring(3)); sendData("GK" + Encoding.encodeVL64(roomID) + "H"); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM users_favourites WHERE userid = '" + userID + "' AND roomid = '" + roomID + "' LIMIT 1"); } } #endregion #region Room event actions internal void ProcessPacketEA() // Events - get setup { sendData("Ep" + Encoding.encodeVL64(eventManager.categoryAmount)); } internal void ProcessPacketEY() // 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 } internal void ProcessPacketDBL() // Events - check if event category is OK D{ { int categoryID = Encoding.decodeVL64(currentPacket.Substring(2)); if (eventManager.categoryOK(categoryID)) sendData("Eb" + Encoding.encodeVL64(categoryID)); } internal void ProcessPacketEUT() // Events - open category E^ { int categoryID = Encoding.decodeVL64(currentPacket.Substring(2)); if (categoryID >= 1 && categoryID <= 11) sendData("Eq" + Encoding.encodeVL64(categoryID) + eventManager.getEvents(categoryID)); } internal void ProcessPacketEZ() // 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)); } } } internal void ProcessPacketESL() // Events - edit event E\ { 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)); } } } internal void ProcessPacketEPAR() // Events - end event E[ { if (_hostsEvent && _isOwner && _inPublicroom == false && roomUser != null) { _hostsEvent = false; eventManager.removeEvent(_roomID); Room.sendData("Er" + "-1"); } } #endregion #region Guestroom create and modify internal void ProcessPacketAGPAR() // Create guestroom - phase 1 @] { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.getInt("SELECT COUNT(id) FROM rooms WHERE owner = '" + _Username + "'") < Config.Navigator_createRoom_maxRooms) { string roomName_B64 = ""; string roomName = ""; string roomModel_B64 = ""; string roomModel = ""; string roomOpentype_B64 = ""; string roomOpentype = ""; int roomShowname = 0; roomName_B64 = currentPacket.Substring(2, 2); roomName = currentPacket.Substring(4, Encoding.decodeB64(roomName_B64)); roomModel_B64 = currentPacket.Substring(Encoding.decodeB64(roomName_B64) + 4, 2); roomModel = currentPacket.Substring(Encoding.decodeB64(roomName_B64) + 6, Encoding.decodeB64(roomModel_B64)); roomOpentype_B64 = currentPacket.Substring(Encoding.decodeB64(roomName_B64) + Encoding.decodeB64(roomModel_B64) + 6, 2); roomOpentype = currentPacket.Substring(Encoding.decodeB64(roomName_B64) + 8 + Encoding.decodeB64(roomModel_B64), Encoding.decodeB64(roomOpentype_B64)); roomShowname = Encoding.decodeVL64(currentPacket.Substring(Encoding.decodeB64(roomName_B64) + 8 + Encoding.decodeB64(roomModel_B64) + Encoding.decodeB64(roomOpentype_B64), 1)); if (roomShowname != 0 && roomShowname != 1) roomShowname = 1; roomModel = roomModel.Substring(6, 1); dbClient.AddParamWithValue("rs2", stringManager.filterSwearwords(roomName)); dbClient.AddParamWithValue("user", _Username); dbClient.AddParamWithValue("rs3", roomModel); dbClient.AddParamWithValue("rs4", roomManager.getRoomState(roomOpentype).ToString()); dbClient.AddParamWithValue("rs5", roomShowname); dbClient.runQuery("INSERT INTO rooms (name, owner, model, state, showname) VALUES (@rs2,@user,@rs3,@rs4,@rs5)"); string roomID = dbClient.getString("SELECT MAX(id) FROM rooms WHERE owner = @user"); sendData("@{" + Encoding.encodeVL64(int.Parse(roomID)) + stringManager.filterSwearwords(roomName) + Convert.ToChar(2)); } else sendData("@a" + "Error creating a private room"); } } internal void ProcessPacketAGY() // Create guestroom - phase 2 / modify guestroom @Y { int roomID = 0; roomID = Encoding.decodeVL64(currentPacket.Substring(2)); string roomDescription_B64 = ""; string roomDescription = ""; string roomPassword_B64 = ""; string roomPassword = ""; int superUsers = 0; int maxVisitors = 25; roomDescription_B64 = currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + 2, 2); roomDescription = stringManager.filterSwearwords(currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + 4, Encoding.decodeB64(roomDescription_B64))); roomPassword_B64 = currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + Encoding.decodeB64(roomDescription_B64) + 4, 2); roomPassword = currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + 6 + Encoding.decodeB64(roomDescription_B64), Encoding.decodeB64(roomPassword_B64)); superUsers = Encoding.decodeVL64(currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + 6 + Encoding.decodeB64(roomDescription_B64) + Encoding.decodeB64(roomPassword_B64), 1)); if (superUsers != 0 && superUsers != 1) if (maxVisitors < 10 || maxVisitors > 50) maxVisitors = 25; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("desc", roomDescription); dbClient.AddParamWithValue("super", superUsers); dbClient.AddParamWithValue("max", maxVisitors); dbClient.AddParamWithValue("pass", roomPassword); dbClient.AddParamWithValue("id", roomID); dbClient.AddParamWithValue("owner", _Username); dbClient.runQuery("UPDATE rooms SET description = @desc,superusers = @super,visitors_max = @max, password = @pass WHERE id = @id AND owner = @owner LIMIT 1"); } } internal void ProcessPacketAGX() // Modify guestroom, save name, state and show/hide ownername @X { int roomID = 0; roomID = Encoding.decodeVL64(currentPacket.Substring(2)); string roomName_B64 = ""; string roomName = ""; string roomOpentype_B64 = ""; string roomOpentype = ""; int show = 0; roomName_B64 = currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + 2, 2); roomName = stringManager.filterSwearwords(currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + 4, Encoding.decodeB64(roomName_B64))); roomOpentype_B64 = currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + Encoding.decodeB64(roomName_B64) + 4, 2); roomOpentype = currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + 6 + Encoding.decodeB64(roomName_B64), Encoding.decodeB64(roomOpentype_B64)); show = Encoding.decodeVL64(currentPacket.Substring(Strings.Len(Encoding.encodeVL64(roomID)) + 6 + Encoding.decodeB64(roomName_B64) + Encoding.decodeB64(roomOpentype_B64), 1)); if (show != 1 && show != 0) show = 1; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", stringManager.filterSwearwords(roomName)); dbClient.AddParamWithValue("state", roomManager.getRoomState(roomOpentype)); dbClient.AddParamWithValue("show", show); dbClient.AddParamWithValue("id", roomID); dbClient.AddParamWithValue("owner", _Username); dbClient.runQuery("UPDATE rooms SET name = @name,state = @state,showname = @show WHERE id = @id AND owner = @owner LIMIT 1"); } } internal void ProcessPacketBX() // Navigator - trigger guestroom modify { int roomID = Encoding.decodeVL64(currentPacket.Substring(2)); string roomCategory; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { roomCategory = dbClient.getString("SELECT category FROM rooms WHERE id = '" + roomID + "' AND owner = '" + _Username + "'"); } if (roomCategory != "") sendData("C^" + Encoding.encodeVL64(roomID) + Encoding.encodeVL64(int.Parse(roomCategory))); } internal void ProcessPacketBY() // Navigator - edit category of a guestroom { int roomID = Encoding.decodeVL64(currentPacket.Substring(2)); int cataID = Encoding.decodeVL64(currentPacket.Substring(Encoding.encodeVL64(roomID).Length + 2)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("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.runQuery("UPDATE rooms SET category = '" + cataID + "' WHERE id = '" + roomID + "' AND owner = '" + _Username + "' LIMIT 1"); } } internal void ProcessPacketAGW() // Guestroom - Delete @W { int roomID = Encoding.decodeVL64(currentPacket.Substring(2)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT id FROM rooms WHERE id = '" + roomID + "' AND owner = '" + _Username + "'") == true) { dbClient.runQuery("DELETE FROM room_rights WHERE roomid = '" + roomID + "'"); dbClient.runQuery("DELETE FROM rooms WHERE id = '" + roomID + "' LIMIT 1"); dbClient.runQuery("DELETE FROM users_favourites WHERE roomid = '" + _roomID + "'"); dbClient.runQuery("DELETE FROM room_votes WHERE roomid = '" + roomID + "'"); dbClient.runQuery("DELETE FROM room_bans WHERE roomid = '" + roomID + "' LIMIT 1"); dbClient.runQuery("DELETE FROM furniture WHERE roomid = '" + roomID + "'"); dbClient.runQuery("DELETE FROM furniture_moodlight WHERE roomid = '" + roomID + "'"); } } if (roomManager.containsRoom(roomID) == true) { roomManager.getRoom(roomID).kickUsers(byte.Parse("9"), "This room has been deleted"); } } internal void ProcessPacketBZ() // Navigator - 'Who's in here' feature for public rooms { int roomID = Encoding.decodeVL64(currentPacket.Substring(2)); if (roomManager.containsRoom(roomID)) sendData("C_" + roomManager.getRoom(roomID).Userlist); else sendData("C_"); } #endregion #region Enter/leave room internal void ProcessPacketAGu() // Rooms - leave room @u { leaveCurrentRoom("", false); } internal void ProcessPacketBv() // Enter room - loading screen advertisement { if (_guideRoom > 0 && _guideSearch == true) sendData("Fh" + Encoding.encodeVL64(_guideRoom)); Config.Rooms_LoadAvertisement_img = ""; if (Config.Rooms_LoadAvertisement_img == "") sendData("DB0"); else sendData("DB" + Config.Rooms_LoadAvertisement_img + Convert.ToChar(2) + Config.Rooms_LoadAvertisement_uri); } internal void ProcessPacketAGB() // Enter room - determine room and check state + max visitors override @B { int roomID = Encoding.decodeVL64(currentPacket.Substring(3)); bool isPublicroom = false; if (roomID == _guideRoom && _guideSearch == true) sendData("Fe"); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if ("" == dbClient.getString("SELECT owner FROM rooms WHERE id = '" + roomID + "'")) { isPublicroom = true; } } sendData("@S"); sendData("Bf" + ""); if (gamePlayer != null && gamePlayer.Game != null) { if (gamePlayer.enteringGame) { Room.removeUser(roomUser.roomUID, false, ""); sendData("AE" + gamePlayer.Game.Lobby.Type + "_arena_" + gamePlayer.Game.mapID + " " + roomID); sendData("Cs" + gamePlayer.Game.getMap()); string s = gamePlayer.Game.getMap(); } else leaveGame(); } else { if (Room != null && roomUser != null) Room.removeUser(roomUser.roomUID, false, ""); if (_teleporterRoomID != roomID) _teleporterID = 0; if (_teleporterID == 0) { bool allowEnterLockedRooms = rankManager.containsRight(this, "fuse_enter_locked_rooms", userID); int accessLevel; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { accessLevel = dbClient.getInt("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") + Convert.ToChar(2)); return; } int nowVisitors; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { nowVisitors = dbClient.getInt("SELECT SUM(visitors_now) FROM rooms WHERE id = '" + roomID + "'"); if (nowVisitors > 0) { int maxVisitors = dbClient.getInt("SELECT SUM(visitors_max) FROM rooms WHERE id = '" + roomID + "'"); if (nowVisitors >= maxVisitors && rankManager.containsRight(this, "fuse_enter_full_rooms", userID) == false) { if (isPublicroom == false) sendData("C`" + "I"); else sendData("BK" + stringManager.getString("room_full") + Convert.ToChar(2)); return; } } } } _roomID = roomID; _inPublicroom = isPublicroom; _ROOMACCESS_PRIMARY_OK = true; if (isPublicroom) { string roomModel; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { roomModel = dbClient.getString("SELECT model FROM rooms WHERE id = '" + roomID + "'"); } sendData("AE" + roomModel + Convert.ToChar(2) + Encoding.encodeVL64(roomID)); _ROOMACCESS_SECONDARY_OK = true; } } } internal void ProcessPacketAGv() // Enter room - guestroom - enter room by using a teleporter @v { sendData("@S"); } internal void ProcessPacketAGy() // Enter room - guestroom - check roomban/password/doorbell @y { if (_inPublicroom == false) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { //saves login room (when you login) dbClient.runQuery("UPDATE users SET onloadroom = '" + _roomID + "' WHERE name = '" + _Username + "'"); //gets certian information int isarrested = dbClient.getInt("SELECT arrested FROM users WHERE name = '" + _Username + "'"); int isdead = dbClient.getInt("SELECT dead FROM users WHERE name = '" + _Username + "'"); int isworking = dbClient.getInt("SELECT working FROM users WHERE name = '" + _Username + "'"); int secure_id = dbClient.getInt("SELECT secure_id FROM users WHERE name = '" + _Username + "'"); int global_job = dbClient.getInt("SELECT global FROM jobs_ranks WHERE id = '" + secure_id + "'"); //checks if you have a global job if (isworking == 1 && isarrested == 0) { int userscorp = dbClient.getInt("SELECT secure_id FROM users WHERE name = '" + _Username + "'"); int workshere = dbClient.getInt("SELECT room_id FROM jobs_rooms WHERE rank_id = '" + userscorp + "' && room_id = '" + _roomID + "'"); if (workshere != _roomID && global_job != 1) { dbClient.runQuery("UPDATE users SET working = '0' WHERE name = '" + _Username + "'"); refreshAppearance(true, true, true); workLooper.Abort(); workLooper = null; } } //checks if you are arrested if (isarrested == 1) { //checks if you are trying to escape prison if (_roomID != 322) { sendData("D^" + "H" + Encoding.encodeVL64(322)); } //stops you from working if you were arrested while working if (isworking == 1) { dbClient.runQuery("UPDATE users SET working = '0' WHERE name = '" + _Username + "'"); workLooper.Abort(); workLooper = null; _Figure = "hd-190-1.ch-220-94.lg-280-94.sh-290-62.hr-125-61"; _Mission = "[Jailed] Convict"; refreshAppearance(false, true, true); } else { _Figure = "hd-190-1.ch-220-94.lg-280-94.sh-290-62.hr-125-61"; _Mission = "[Jailed] Convict"; refreshAppearance(false, true, true); } } //chcks if you are trying to escape the hospital while dead if (isdead == 1) { if (_roomID != 168) { sendData("BK" + "You cannot leave the room while you are knocked out." + Convert.ToChar(2)); sendData("D^" + "H" + Encoding.encodeVL64(168)); } //stops you from working if you were killed while working if (isworking == 1) { dbClient.runQuery("UPDATE users SET working = '0' WHERE name = '" + _Username + "'"); workLooper.Abort(); workLooper = null; refreshAppearance(true, true, true); _Mission = "[Dead] "; refreshAppearance(false, true, true); } else { _Mission = "[Dead]"; refreshAppearance(false, true, true); } } } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { _isOwner = dbClient.findsResult("SELECT id FROM rooms WHERE id = '" + _roomID + "' AND owner = '" + _Username + "'"); if (_isOwner == false) _hasRights = dbClient.findsResult("SELECT userid FROM room_rights WHERE roomid = '" + _roomID + "' AND userid = '" + userID + "'"); if (_hasRights == false) _hasRights = dbClient.findsResult("SELECT id FROM rooms WHERE id = '" + _roomID + "' AND superusers = '1'"); if (_teleporterID == 0 && _isOwner == false && rankManager.containsRight(this, "fuse_enter_locked_rooms", userID) == false) { int accessFlag = dbClient.getInt("SELECT state FROM rooms WHERE id = '" + _roomID + "'"); if (_ROOMACCESS_PRIMARY_OK == false && accessFlag != 2) { return; } // Check for roombans if (dbClient.findsResult("SELECT roomid FROM room_bans WHERE roomid = '" + _roomID + "' AND userid = '" + userID + "'")) { DateTime banExpireMoment = DateTime.Parse(dbClient.getString("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.runQuery("DELETE FROM room_bans WHERE roomid = '" + _roomID + "' AND userid = '" + userID + "' LIMIT 1"); } if (accessFlag == 1) // Doorbell { if (roomManager.containsRoom(_roomID) == false) { sendData("BC"); return; } else { roomManager.getRoom(_roomID).sendDataToRights("A[" + _Username + Convert.ToChar(2)); sendData("A[" + Convert.ToChar(2)); return; } } else if (accessFlag == 2) // Password { string givenPassword = ""; try { givenPassword = currentPacket.Substring(Encoding.encodeVL64(_roomID).Length + 4); } catch { } string roomPassword = dbClient.getString("SELECT password FROM rooms WHERE id = '" + _roomID + "' LIMIT 1"); if (givenPassword != roomPassword) { sendData("@a" + "fhFF" + Convert.ToChar(2)); /*dbClient.Close();*/ return; } } } _ROOMACCESS_SECONDARY_OK = true; sendData("@i"); } } } internal void ProcessPacketAb() // Answer guestroom doorbell { if (_hasRights == false && rankManager.containsRight(roomUser.User, "fuse_enter_locked_rooms", userID)) return; string ringer = currentPacket.Substring(4, Encoding.decodeB64(currentPacket.Substring(2, 2))); int letIn = Encoding.decodeVL64(currentPacket.Substring(currentPacket.Length - 1)); virtualUser ringerData = userManager.getUser(ringer); if (ringerData == null) return; if (ringerData._roomID != _roomID) return; if (letIn == 1) { ringerData._ROOMACCESS_SECONDARY_OK = true; Room.sendDataToRights("@i" + ringer + Convert.ToChar(2)); ringerData.sendData("@i"); } else { ringerData.sendData("BC"); ringerData._roomID = 0; ringerData._inPublicroom = false; ringerData._ROOMACCESS_PRIMARY_OK = false; ringerData._ROOMACCESS_SECONDARY_OK = false; ringerData._isOwner = false; ringerData._hasRights = false; ringerData.Room = null; ringerData.roomUser = null; } } internal void ProcessPacketAGBL() // Enter room - guestroom - guestroom only data: model, landscape, wallpaper, rights, room votes @{ { if (_ROOMACCESS_SECONDARY_OK && _inPublicroom == false) { DataRow dRow; string Landscape; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT model, wallpaper, floor FROM rooms WHERE id = '" + _roomID + "'"); Landscape = dbClient.getString("SELECT landscape FROM rooms WHERE id = '" + _roomID + "'"); } string Model = "model_" + Convert.ToString(dRow["model"]); sendData("AE" + Model + Convert.ToChar(2) + Encoding.encodeVL64(_roomID)); int Wallpaper = Convert.ToInt32(dRow["wallpaper"]); int Floor = Convert.ToInt32(dRow["floor"]); sendData("@n" + "landscape" + Convert.ToChar(2) + Landscape.Replace(",", ".") + Convert.ToChar(2)); if (Wallpaper > 0) sendData("@n" + "wallpaper" + Convert.ToChar(2) + Wallpaper + Convert.ToChar(2)); if (Floor > 0) sendData("@n" + "floor" + Convert.ToChar(2) + Floor + Convert.ToChar(2)); if (_isOwner == false) { _isOwner = rankManager.containsRight(this, "fuse_any_room_controller", userID); } if (_isOwner) { _hasRights = true; sendData("@o"); } if (_hasRights) sendData("@j"); int voteAmount = -1; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT userid FROM room_votes WHERE userid = '" + userID + "' AND roomid = '" + _roomID + "'") | _isOwner == true) { voteAmount = dbClient.getInt("SELECT SUM(vote) FROM room_votes WHERE roomid = '" + _roomID + "'"); if (voteAmount < 0) { voteAmount = 0; } } } sendData("EY" + Encoding.encodeVL64(voteAmount)); sendData("Er" + eventManager.getEvent(_roomID)); } } internal void ProcessPacketACA() // Enter room - get room advertisement A~ { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_inPublicroom && dbClient.findsResult("SELECT roomid FROM room_ads WHERE roomid = '" + _roomID + "'")) { DataRow dRow = dbClient.getRow("SELECT img, uri FROM room_ads WHERE roomid = '" + _roomID + "'"); string advImg = Convert.ToString(dRow["img"]); string advUri = Convert.ToString(dRow["uri"]); sendData("CP" + advImg + Convert.ToChar(2) + advUri); } else sendData("CP" + "0"); } } internal void ProcessPacketAG0() // 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 + Convert.ToChar(2)); sendData("GV" + Room.Heightmap + Convert.ToChar(2)); string roomUsers = Room.dynamicUnits; int inCnt = 0; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { inCnt = dbClient.getInt("SELECT visitors_now FROM rooms WHERE id = " + _roomID); } sendData(@"@\" + Room.dynamicUnits); } else { if (gamePlayer != null && gamePlayer.enteringGame && gamePlayer.teamID != -1 && gamePlayer.Game != null) { sendData("@_" + gamePlayer.Game.Heightmap); sendData("Cs" + gamePlayer.Game.getPlayers()); string s = gamePlayer.Game.getPlayers(); } gamePlayer.enteringGame = false; } } internal void ProcessPacketAGBL2() // Enter room - get items @} { if (_ROOMACCESS_SECONDARY_OK && Room != null) { sendData("@^" + Room.PublicroomItems); sendData("@`" + Room.Flooritems); { } } } internal void ProcessPacketAGCA() // Enter room - get group badges, optional skill levels in game lobbies and sprite index @~ { if (_ROOMACCESS_SECONDARY_OK && Room != null) { sendData("Du" + Room.Groups); if (Room.Lobby != null) { sendData("Cg" + "H" + Room.Lobby.Rank.Title + Convert.ToChar(2) + Encoding.encodeVL64(Room.Lobby.Rank.minPoints) + Encoding.encodeVL64(Room.Lobby.Rank.maxPoints)); sendData("Cz" + Room.Lobby.playerRanks); } if (_receivedSpriteIndex == false) { sendData("DiH" + Convert.ToChar(1) + "DuH"); _receivedSpriteIndex = true; } } } internal void ProcessPacketAGWTF() // Enter room - guestroom - get wallitems @ { if (_ROOMACCESS_SECONDARY_OK && Room != null) sendData("@m" + Room.Wallitems); } internal void ProcessPacketAAG() // Enter room - add this user to room A@ { if (_ROOMACCESS_SECONDARY_OK && Room != null && roomUser == null) { Room.addUser(this); statusManager.dropCarrydItem(); Room.refreshActions(roomUser.roomUID); Room.sendData("@b" + Room.dynamicStatuses); if (Room.hasSpecialCasts("cam1")) { sendData("AGcam1 targetcamera " + roomUser.roomUID); } } return; } #endregion #region Moderation #region MOD-Tool internal void ProcessPacketCH() // MOD-Tool { int messageLength = 0; string Message = ""; int staffNoteLength = 0; string staffNote = ""; string targetUser = ""; switch (currentPacket.Substring(2, 2)) // Select the action { #region Alert single user case "HH": // Alert single user { if (rankManager.containsRight(this, "fuse_alert", userID) == false) { sendData("BK" + stringManager.getString("modtool_accesserror") + Convert.ToChar(2)); return; } messageLength = Encoding.decodeB64(currentPacket.Substring(4, 2)); Message = currentPacket.Substring(6, messageLength).Replace(Convert.ToChar(1).ToString(), " "); staffNoteLength = Encoding.decodeB64(currentPacket.Substring(messageLength + 6, 2)); staffNote = currentPacket.Substring(messageLength + 8, staffNoteLength); targetUser = currentPacket.Substring(messageLength + staffNoteLength + 10); if (Message == "" || targetUser == "") return; virtualUser _targetUser = userManager.getUser(targetUser); if (_targetUser == null) sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_usernotfound") + Convert.ToChar(2)); else { _targetUser.sendData("B!" + Message + Convert.ToChar(2)); staffManager.addStaffMessage("alert", userID, _targetUser.userID, Message, staffNote); } break; } #endregion #region Kick single user from room case "HI": // Kick single user from room { if (rankManager.containsRight(this, "fuse_kick", userID) == false) { sendData("BK" + stringManager.getString("modtool_accesserror") + Convert.ToChar(2)); return; } messageLength = Encoding.decodeB64(currentPacket.Substring(4, 2)); Message = currentPacket.Substring(6, messageLength).Replace(Convert.ToChar(1).ToString(), " "); staffNoteLength = Encoding.decodeB64(currentPacket.Substring(messageLength + 6, 2)); staffNote = currentPacket.Substring(messageLength + 8, staffNoteLength); targetUser = currentPacket.Substring(messageLength + staffNoteLength + 10); if (Message == "" || targetUser == "") return; virtualUser _targetUser = userManager.getUser(targetUser); if (_targetUser == null) sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_usernotfound") + Convert.ToChar(2)); 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, staffNote); } else sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_rankerror") + Convert.ToChar(2)); } } break; } #endregion #region Ban single user case "HJ": // Ban single user / IP { if (rankManager.containsRight(this, "fuse_ban", userID) == false) { sendData("BK" + stringManager.getString("modtool_accesserror") + Convert.ToChar(2)); return; } int targetUserLength = 0; int banHours = 0; int banIP = Encoding.decodeVL64(currentPacket.Substring(currentPacket.Length - 1, 1)); messageLength = Encoding.decodeB64(currentPacket.Substring(4, 2)); Message = currentPacket.Substring(6, messageLength).Replace(Convert.ToChar(1).ToString(), " "); staffNoteLength = Encoding.decodeB64(currentPacket.Substring(messageLength + 6, 2)); staffNote = currentPacket.Substring(messageLength + 8, staffNoteLength); targetUserLength = Encoding.decodeB64(currentPacket.Substring(messageLength + staffNoteLength + 8, 2)); targetUser = currentPacket.Substring(messageLength + staffNoteLength + 10, targetUserLength); banHours = Encoding.decodeVL64(currentPacket.Substring(messageLength + staffNoteLength + targetUserLength + 10)); if (Message == "" || targetUser == "" || banHours == 0) return; else { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", targetUser); dRow = dbClient.getRow("SELECT id,rank,ipaddress_last FROM users WHERE name = @name"); } if (dRow.Table.Rows.Count == 0) { sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_usernotfound") + Convert.ToChar(2)); return; } else if (Convert.ToByte(dRow["rank"]) >= _Rank) { sendData("BK" + stringManager.getString("modtool_actionfail") + "\r" + stringManager.getString("modtool_rankerror") + Convert.ToChar(2)); return; } int targetID = Convert.ToInt32(dRow["id"]); string Report = ""; staffManager.addStaffMessage("ban", userID, targetID, Message, staffNote); if (banIP == 1 && rankManager.containsRight(this, "fuse_superban", userID)) // IP ban is chosen and allowed for this staff member { userManager.setBan(Convert.ToString(dRow["ipaddress_last"]), banHours, Message, targetID); Report = userManager.generateBanReport(targetID); } else { userManager.setBan(targetID, banHours, Message); Report = userManager.generateBanReport(targetID); } sendData("BK" + Report + Convert.ToChar(2)); } break; } #endregion #region Room alert case "IH": // Alert all users in current room { if (rankManager.containsRight(this, "fuse_room_alert", userID) == false) { sendData("BK" + stringManager.getString("modtool_accesserror") + Convert.ToChar(2)); return; } if (Room == null || roomUser == null) { return; } messageLength = Encoding.decodeB64(currentPacket.Substring(4, 2)); Message = currentPacket.Substring(6, messageLength).Replace(Convert.ToChar(1).ToString(), " "); staffNoteLength = Encoding.decodeB64(currentPacket.Substring(messageLength + 6, 2)); 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(this, "fuse_room_kick", userID) == false) { sendData("BK" + stringManager.getString("modtool_accesserror") + Convert.ToChar(2)); return; } if (Room == null || roomUser == null) { return; } messageLength = Encoding.decodeB64(currentPacket.Substring(4, 2)); Message = currentPacket.Substring(6, messageLength).Replace(Convert.ToChar(1).ToString(), " "); staffNoteLength = Encoding.decodeB64(currentPacket.Substring(messageLength + 6, 2)); staffNote = currentPacket.Substring(messageLength + 8, staffNoteLength); if (Message != "") { Room.kickUsers(_Rank, Message); staffManager.addStaffMessage("rkick", userID, _roomID, Message, staffNote); } break; } #endregion } } #endregion #region Call For Help #region User Side internal void ProcessPacketCm() // User wants to send a CFH message { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT id, date, message FROM cms_help WHERE username = '" + _Username + "' AND picked_up = '0'"); } if (dRow.Table.Rows.Count == 0) sendData("D" + "H"); else sendData("D" + "I" + Convert.ToString(dRow[0]) + Convert.ToChar(2) + Convert.ToString(dRow[1]) + Convert.ToChar(2) + Convert.ToString(dRow[2]) + Convert.ToChar(2)); } internal void ProcessPacketCn() // User deletes his pending CFH message { int cfhID; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { cfhID = dbClient.getInt("SELECT id FROM cms_help WHERE username = '" + _Username + "' AND picked_up = '0'"); dbClient.runQuery("DELETE FROM cms_help WHERE picked_up = '0' AND username = '" + _Username + "' LIMIT 1"); } sendData("DH"); userManager.sendToRank(Config.Minimum_CFH_Rank, true, "DQ" + Encoding.encodeVL64(cfhID) + Convert.ToChar(2)); } internal void ProcessPacketAV() // User sends CFH message { if (_blockCFH == true) { sendData("BKYou have been blocked from Live Help!" + Convert.ToChar(2)); return; } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT id FROM cms_help WHERE username = '" + _Username + "' AND picked_up = '0'") == true) return; } int messageLength = Encoding.decodeB64(currentPacket.Substring(2, 2)); if (messageLength == 0) return; string cfhMessage = currentPacket.Substring(4, messageLength); int cfhID; string roomName; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("username", _Username); dbClient.AddParamWithValue("ip", _ConnectionManager.connectionRemoteIP); dbClient.AddParamWithValue("message", cfhMessage); dbClient.AddParamWithValue("date", DateTime.Now); dbClient.AddParamWithValue("roomid", _roomID.ToString()); dbClient.runQuery("INSERT INTO cms_help (username,ip,message,date,picked_up,subject,roomid) VALUES (@username,@ip,@message,@date,'0','CFH message [hotel]',@roomid)"); cfhID = dbClient.getInt("SELECT id FROM cms_help WHERE username = @username AND picked_up = '0'"); roomName = dbClient.getString("SELECT name FROM rooms WHERE id = @roomid");// H = Hide Room ID / I = Show Room ID } // H = Automated / I = Manual sendData("EAH"); // \_/ \_/ userManager.sendToRank(Config.Minimum_CFH_Rank, true, "BT" + Encoding.encodeVL64(cfhID) + Convert.ToChar(2) + "I" + "Sent: " + DateTime.Now + Convert.ToChar(2) + _Username + Convert.ToChar(2) + cfhMessage + Convert.ToChar(2) + Encoding.encodeVL64(_roomID) + Convert.ToChar(2) + roomName + Convert.ToChar(2) + "I" + Convert.ToChar(2) + Encoding.encodeVL64(_roomID)); } #endregion #region Staff Side internal void ProcessPacketCG() // CFH center - reply call { if (rankManager.containsRight(this, "fuse_receive_calls_for_help", userID) == false) return; int cfhID = Encoding.decodeVL64(currentPacket.Substring(4, Encoding.decodeB64(currentPacket.Substring(2, 2)))); string cfhReply = currentPacket.Substring(Encoding.decodeB64(currentPacket.Substring(2, 2)) + 6); string toUserName; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { toUserName = dbClient.getString("SELECT username FROM cms_help WHERE id = '" + cfhID + "'"); } if (toUserName == null) sendData("BK" + stringManager.getString("cfh_fail") + Convert.ToChar(2)); else { int toUserID = userManager.getUserID(toUserName); virtualUser toVirtualUser = userManager.getUser(toUserID); if (toVirtualUser._isLoggedIn) { toVirtualUser.sendData("DR" + cfhReply + Convert.ToChar(2)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM cms_help WHERE id = '" + cfhID + "' LIMIT 1"); } userManager.sendToRank(Config.Minimum_CFH_Rank, true, "DQ" + Encoding.encodeVL64(cfhID) + Convert.ToChar(2)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE cms_help SET picked_up = '" + _Username + "' WHERE id = '" + cfhID + "' LIMIT 1"); } } } } internal void ProcessPacketCF() // CFH center - Delete (Downgrade) { if (rankManager.containsRight(this, "fuse_receive_calls_for_help", userID) == false) return; int cfhID = Encoding.decodeVL64(currentPacket.Substring(4, Encoding.decodeB64(currentPacket.Substring(2, 2)))); DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT picked_up FROM cms_help WHERE id = '" + cfhID + "'"); } if (dRow.Table.Columns.Count == 0) { return; } else { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM cms_help WHERE id = '" + cfhID + "' LIMIT 1"); } userManager.sendToRank(Config.Minimum_CFH_Rank, true, "BT" + Encoding.encodeVL64(cfhID) + Convert.ToChar(2) + "H" + "Staff Deleted!" + Convert.ToChar(2) + "Staff Deleted!" + Convert.ToChar(2) + "Staff Deleted!" + Convert.ToChar(2) + "H" + Convert.ToChar(2) + Convert.ToChar(2) + "H" + Convert.ToChar(2) + "H"); } } internal void ProcessPacketAGp() // CFH center - Pickup @p { int cfhID = Encoding.decodeVL64(currentPacket.Substring(4)); int cfhAction = Encoding.decodeVL64(currentPacket.Substring(Encoding.encodeVL64(cfhID).Length + 4)); string userName = ""; bool result; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { userName = dbClient.getString("SELECT username FROM cms_help WHERE id = '" + cfhID + "'"); result = dbClient.findsResult("SELECT id FROM cms_help WHERE id = '" + cfhID + "'"); } if (result == false) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM cms_help WHERE id = '" + cfhID + "' LIMIT 1"); } userManager.sendToRank(Config.Minimum_CFH_Rank, true, "DQ" + Encoding.encodeVL64(cfhID) + Convert.ToChar(2)); return; } if (cfhAction == 1) // Block from requesting help { int toUserID = userManager.getUserID(userName); virtualUser toVirtualUser = userManager.getUser(toUserID); if (toVirtualUser._isLoggedIn) toVirtualUser._blockCFH = true; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM cms_help WHERE id = '" + cfhID + "' LIMIT 1"); } userManager.sendToRank(Config.Minimum_CFH_Rank, true, "DQ" + Encoding.encodeVL64(cfhID) + Convert.ToChar(2)); return; } DataRow dRow; string roomName; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT picked_up,username,message,roomid FROM cms_help WHERE id = '" + cfhID + "'"); roomName = dbClient.getString("SELECT name FROM rooms WHERE id = '" + Convert.ToString(dRow[3]) + "'"); } userManager.sendToRank(Config.Minimum_CFH_Rank, true, "BT" + Encoding.encodeVL64(cfhID) + Convert.ToChar(2) + "I" + "Picked up by " + _Username + " at " + DateTime.Now.ToLongTimeString() + "!" + Convert.ToChar(2) + Convert.ToString(dRow[1]) + Convert.ToChar(2) + Convert.ToString(dRow[2]) + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow[3])) + Convert.ToChar(2) + roomName + Convert.ToChar(2) + "I" + Convert.ToChar(2) + Encoding.encodeVL64(Convert.ToInt32(dRow[3]))); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE cms_help SET picked_up = '1' WHERE id = '" + cfhID + "' LIMIT 1"); } } internal void ProcessPacketEC() // Go to the room that the call for help was sent from { if (rankManager.containsRight(this, "fuse_receive_calls_for_help", userID) == false) return; int idLength = Encoding.decodeB64(currentPacket.Substring(2, 2)); int cfhID = Encoding.decodeVL64(currentPacket.Substring(4, idLength)); int roomID; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { roomID = dbClient.getInt("SELECT roomid FROM cms_help WHERE id = '" + cfhID + "'"); } if (roomID == 0) return; virtualRoom room = roomManager.getRoom(roomID); if (room.isPublicroom) sendData("D^" + "I" + Encoding.encodeVL64(roomID)); else sendData("D^" + "H" + Encoding.encodeVL64(roomID)); } #endregion #endregion #endregion #region In-room actions #region Misc internal void ProcessPacketDThingy() { string Target = currentPacket.Substring(4); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) try { virtualUser _Target = userManager.getUser(Target); if (_Target._Rank > 3) return; _mutedIDs += "<" + _Target.userID + ">"; sendData("FcI"); } catch { } } internal void ProcessPacketEB() { string Target = currentPacket.Substring(4); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) try { virtualUser _Target = userManager.getUser(Target); if (_Target._Rank > 3) return; _mutedIDs = _mutedIDs.Replace("<" + _Target.userID + ">", ""); sendData("FcK"); } catch { } } internal void ProcessPacketAO() // Room - rotate user { if (Room != null && roomUser != null && statusManager.containsStatus("sit") == false && statusManager.containsStatus("lay") == false) { int X = Encoding.decodeVL64(currentPacket.Substring(2)); int Y = Encoding.decodeVL64(currentPacket.Substring(Encoding.encodeVL64((X)).Length + 2)); roomUser.Z1 = Rooms.Pathfinding.Rotation.Calculate(roomUser.X, roomUser.Y, X, Y); roomUser.Z2 = roomUser.Z1; roomUser.Refresh(); } } internal void ProcessPacketAK() // Room - walk to a new square { if (Room != null && roomUser != null && roomUser.walkLock == false) { int goalX = Encoding.decodeVL64(currentPacket.Substring(2)); int goalY = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(goalX).Length)); if (goalX == Room.doorX && Room.doorY == goalY) { sendData("@R"); Handler.ProcessPacket("@u"); return; } if (roomUser.SPECIAL_TELEPORTABLE) //wat is hier mee? P { int oldX = roomUser.X; int oldY = roomUser.Y; roomUser.X = goalX; roomUser.Y = goalY; roomUser.goalX = -1; Room.refreshCoord(goalX, goalY); Room.sqUNIT[oldX, oldY] = false; Room.setSquareState(oldX, oldY, 1, 1, virtualRoom.squareState.Open); refreshAppearance(false, false, true); } else { roomUser.goalX = goalX; roomUser.goalY = goalY; } } return; } internal void ProcessPacketAt() // 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") { roomUser.swimOutfit = currentPacket.Substring(2); 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_swim", currentPacket.Substring(2)); dbClient.AddParamWithValue("id", userID); dbClient.runQuery("UPDATE users SET figure_swim = @figure_swim WHERE id = @id LIMIT 1"); } } } } internal void ProcessPacketB__() // Load users badge { if (Room != null && roomUser != null && roomUser.walkDoor == false) { string bSlots = ""; int slotsCount = 0; int partnerUID = Encoding.decodeVL64(currentPacket.Substring(2)); virtualUser Partner = userManager.getUser(partnerUID); if (Partner._Badges.Count > 0) { for (int i = 0; i < Partner._Badges.Count; i++) { if (Partner._badgeSlotIDs[i] > 0) { slotsCount++; bSlots += Encoding.encodeVL64(Partner._badgeSlotIDs[i]); bSlots += Partner._Badges[i] + Convert.ToChar(2); } } } sendData("Cd" + partnerUID + Convert.ToChar(2) + Encoding.encodeVL64(slotsCount) + bSlots); } } internal void ProcessPacketBUL() // Badges - switch or toggle on/off badge B^ { { if (Room != null && roomUser != null) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users_badges SET slotid = '0' WHERE userid = '" + this.userID + "'"); } int enabledBadgeAmount = 0; string szWorkData = currentPacket.Substring(2); while (szWorkData != "") { int slotID = Encoding.decodeVL64(szWorkData); szWorkData = szWorkData.Substring(Encoding.encodeVL64(slotID).Length); int badgeNameLength = Encoding.decodeB64(szWorkData.Substring(0, 2)); if (badgeNameLength > 0) { string Badge = szWorkData.Substring(2, badgeNameLength); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users_badges SET slotid = '" + slotID + "' WHERE userid = '" + this.userID + "' AND badgeid = '" + Badge + "' LIMIT 1"); // update slot } enabledBadgeAmount++; } szWorkData = szWorkData.Substring(badgeNameLength + 2); } // Active badges have their badge slot set now, other ones have '0' refreshBadges(); string szNotify = this.userID + Convert.ToChar(2).ToString() + Encoding.encodeVL64(enabledBadgeAmount); for (int x = 0; x < _Badges.Count; x++) { if (_badgeSlotIDs[x] > 0) // Badge enabled { szNotify += Encoding.encodeVL64(_badgeSlotIDs[x]); szNotify += _Badges[x]; szNotify += Convert.ToChar(2); } } Room.sendData("Cd" + szNotify); } } } internal void ProcessPacketEs() { if (Respect == 0) return; else { Respect--; int leftRespects = 0; int receiverUserID = Encoding.decodeVL64(currentPacket.Substring(2)); virtualUser _User = userManager.getUser(receiverUserID); if (_User.roomUser.roomID != this.roomUser.roomID) // If user is not in same room, break this case return; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { leftRespects = dbClient.getInt("SELECT userid FROM users_respected WHERE userid = " + this.userID + " AND respectedid = " + _User.userID + " LIMIT 1"); if (leftRespects != this.userID) { dbClient.runQuery("INSERT INTO users_respected (userid,respectedid) VALUES ('" + this.userID + "','" + _User.userID + "')"); dbClient.runQuery("UPDATE users SET respect_received = respect_received + 1 WHERE id = " + receiverUserID + " LIMIT 1"); dbClient.runQuery("UPDATE users SET respect_given = respect_given + 1 WHERE id = " + this.userID + " LIMIT 1"); } } Room.sendData("Fx" + Encoding.encodeVL64(receiverUserID) + "QRB"); } } internal void ProcessPacketDG() // Tags - get tags of virtual user { int ownerID = Encoding.decodeVL64(currentPacket.Substring(2)); DataColumn dCol; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dCol = dbClient.getColumn("SELECT tag FROM cms_tags WHERE ownerid = '" + ownerID + "' LIMIT 20"); } StringBuilder List = new StringBuilder(Encoding.encodeVL64(ownerID) + Encoding.encodeVL64(dCol.Table.Rows.Count)); foreach (DataRow dRow in dCol.Table.Rows) List.Append(Convert.ToString(dRow["tag"]) + Convert.ToChar(2)); sendData("E^" + List.ToString()); } internal void ProcessPacketCg() // Group badges - get details about a group [click badge] { if (Room != null && roomUser != null) { int groupID = Encoding.decodeVL64(currentPacket.Substring(2)); DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT name,description,roomid FROM groups_details WHERE id = '" + groupID + "'"); } if (dRow.Table.Rows.Count == 1) { string roomName = ""; int roomID = Convert.ToInt32(dRow["roomid"]); if (roomID > 0) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { roomName = dbClient.getString("SELECT name FROM rooms WHERE id = '" + roomID + "'"); } } else roomID = -1; string gRoom; if (roomName == "") { gRoom = "M"; } else { gRoom = Encoding.encodeVL64(Convert.ToInt32(dRow["roomid"])); } sendData("Dw" + Encoding.encodeVL64(groupID) + Convert.ToString(dRow["name"]) + Convert.ToChar(2) + Convert.ToString(dRow["description"]) + Convert.ToChar(2) + gRoom + roomName + Convert.ToChar(2)); } } } internal void ProcessPacketAUL() // Statuses - wave A^ { if (Room != null && roomUser != null) { Room.sendData("Ga" + Encoding.encodeVL64(roomUser.roomUID)); } } internal void ProcessPacketAPAR() // Statuses - dance A] { if (Room != null && roomUser != null && statusManager.containsStatus("sit") == false && statusManager.containsStatus("lay") == false) { int danceID = Encoding.decodeVL64(currentPacket.Substring(2)); if (danceID > 2 && rankManager.containsRight(this, "fuse_use_club_dance", userID) == false) { return; } if (danceID < -1 || danceID > 4) { return; } statusID = "G`"; statusCount = danceID; sendData(currentPacket); Room.sendData(statusID + Encoding.encodeVL64(roomUser.roomUID) + Encoding.encodeVL64(statusCount)); statusManager.Refresh(); } } internal void ProcessPacketAP() // Statuses - carry item { { if (currentPacket.Substring(2) != "H") sendData("@aThere is no drink machine."); } } internal void ProcessPacketAh() // Statuses - Lido Voting { if (Room != null && roomUser != null && statusManager.containsStatus("swim") == false && statusManager.containsStatus("sit") == false && statusManager.containsStatus("lay") == false) { int signID = Encoding.decodeVL64(currentPacket.Substring(2)); statusManager.handleStatus("sign", Convert.ToString(signID), Config.Statuses_Wave_waveDuration); statusManager.Refresh(); } } #endregion #region Chat internal void ProcessPacketAGw() // Chat - shout @w { try { if (_isMuted == false && (Room != null && roomUser != null)) { string Message = currentPacket.Substring(4); userManager.addChatMessage(_Username, _roomID, Message); Message = stringManager.filterSwearwords(Message); if (Message.Substring(0, 1) == ":" && isSpeechCommand(Message.Substring(1))) // Speechcommand invoked! { if (roomUser.isTyping) { Room.sendData("Ei" + Encoding.encodeVL64(roomUser.roomUID) + "H"); roomUser.isTyping = false; } } else { if (currentPacket.Substring(1, 1) == "w") // Shout { Room.sendShout(roomUser, Message); } else { Room.sendSaying(roomUser, Message); } } } } catch (Exception) { } return; } internal void ProcessPacketAGx() // Chat - whisper @x { if (_isMuted == false && Room != null && roomUser != null) { string Receiver = currentPacket.Substring(4).Split(' ')[0]; string Message = currentPacket.Substring(Receiver.Length + 5); userManager.addChatMessage(_Username, _roomID, Message); Message = stringManager.filterSwearwords(Message); Room.sendWhisper(roomUser, Receiver, Message); } } internal void ProcessPacketDBL21() // Chat - show speech bubble D} { if (_isMuted == false && Room != null && roomUser != null) { Room.sendData("Ei" + Encoding.encodeVL64(roomUser.roomUID) + "I"); roomUser.isTyping = true; } } internal void ProcessPacketDCA() // Chat - hide speech bubble D~ { if (Room != null && roomUser != null) { Room.sendData("Ei" + Encoding.encodeVL64(roomUser.roomUID) + "H"); roomUser.isTyping = false; } } #endregion #region Guestroom - rights, kicking, roombans and room voting internal void ProcessPacketATNG() // Give rights A` { if (Room == null || roomUser == null || _inPublicroom || _isOwner == false) return; int Target = Encoding.decodeVL64(currentPacket.Substring(2)); virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID || _Target._hasRights || _Target._isOwner) return; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("INSERT INTO room_rights(roomid,userid) VALUES ('" + _roomID + "','" + _Target.userID + "')"); } _Target._hasRights = true; _Target.statusManager.addStatus("flatctrl", "onlyfurniture"); _Target.roomUser.Refresh(); _Target.sendData("@j"); } internal void ProcessPacketAa() // Take rights { if (Room == null || roomUser == null || _inPublicroom || _isOwner == false) return; int Target = Encoding.decodeVL64(currentPacket.Substring(2)); virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID || _Target._hasRights == false || _Target._isOwner) return; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("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"); } internal void ProcessPacketA_() // Kick user A_ { if (Room == null || roomUser == null || _inPublicroom || _hasRights == false) return; int Target = Encoding.decodeVL64(currentPacket.Substring(2)); virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID) return; if (_Target._isOwner && (_Target._Rank > _Rank || rankManager.containsRight(_Target, "fuse_kick_immunity", userID))) return; if (_Target._isOwner && (_Target._Rank > _Rank || rankManager.containsRight(_Target, "fuse_any_room_controller", userID))) return; _Target.roomUser.walkLock = true; _Target.roomUser.walkDoor = true; _Target.roomUser.goalX = Room.doorX; _Target.roomUser.goalY = Room.doorY; } internal void ProcessPacketApeo() // Kick user { if (Room == null) { userManager.sendData(currentPacket.Substring(2) + Convert.ToChar(2)); } } internal void ProcessPacketEAT() // Kick and apply roomban E@ { if (_hasRights == false || _inPublicroom || Room == null || roomUser == null) return; int Target = Encoding.decodeVL64(currentPacket.Substring(2)); virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID) return; if (_Target._isOwner && (_Target._Rank - 1 > _Rank || rankManager.containsRight(_Target, "fuse_any_room_controller", userID))) return; if (_Target._isOwner && (_Target._Rank - 1 > _Rank || rankManager.containsRight(_Target, "fuse_kick_immunity", userID))) return; string banExpireMoment = DateTime.Now.AddMinutes(Config.Rooms_roomBan_banDuration).ToString(); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("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; } internal void ProcessPacketDE() // Vote -1 or +1 on room { if (_inPublicroom || Room == null || roomUser == null | _isOwner == true) return; int Vote = Encoding.decodeVL64(currentPacket.Substring(2)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if ((Vote == 1 || Vote == -1) && dbClient.findsResult("SELECT userid FROM room_votes WHERE userid = '" + userID + "' AND roomid = '" + _roomID + "'") == false) { dbClient.runQuery("INSERT INTO room_votes (userid,roomid,vote) VALUES ('" + userID + "','" + _roomID + "','" + Vote + "')"); int voteAmount = dbClient.getInt("SELECT SUM(vote) FROM room_votes WHERE roomid = '" + _roomID + "'"); if (voteAmount < 0) voteAmount = 0; roomUser.hasVoted = true; roomUser.Room.sendNewVoteAmount(voteAmount); } } } #endregion #region Catalogue and Recycler internal void ProcessPacketAe() // Catalogue - open, retrieve index of pages { string Data = catalogueManager.getPageIndex(Convert.ToInt16(_Rank)); sendData("A~" + "HHHM" + Convert.ToChar(2) + Data); } internal void ProcessPacketAf() // Catalogue, open page, get page content { { string pageIndexName = currentPacket.Substring(2); if (pageIndexName == "M") { return; } sendData("A" + currentPacket.Substring(2) + catalogueManager.getPage(pageIndexName, _Rank)); if (_receivedSpriteIndex == false) { sendData("DiH" + Convert.ToChar(1) + "DuH"); _receivedSpriteIndex = true; } } } internal void ProcessPacketAcatacredits() { sendData("c}AAinfo_creditsHPBWhat are Habbo credits?Habbo Credits are the hotel's currency. You can use them to buy all kinds of things, from rubber ducks and sofas to VIP membership, jukeboxes and teleports.How to get credits?You can get credits with credit card, SMS, home phone etc.. For a best deal, check out theInstructions in the Web >>How to spend?Check out the furni shop >>Furni ShopH"); } internal void ProcessPacketAcatapixel() { sendData("`~AAinfo_pixelsHPBWhat are pixels?Pixels are value you can earn by playing.How to get pixels?1. Sign into Habbo once a day2. Get rewarded for spending time each day in Habbo - the longer you stay the more you earn!3. Complete Achievements, work as a Guide and give respect to other users.4. Join Habbo Club!Check out Achievements >>How to spend pixels?Check out the pixel shop >>Pixel ShopH"); } #region buy catalogue & Recycle internal void ProcessPacketF893() // Recycle furnitures { int count = Encoding.decodeVL64(currentPacket.Substring(2)); int id_1 = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(count).Length)); int id_2 = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(id_1).Length + Encoding.encodeVL64(count).Length)); int id_3 = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(id_1).Length + Encoding.encodeVL64(id_2).Length + Encoding.encodeVL64(count).Length)); int id_4 = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(id_1).Length + Encoding.encodeVL64(id_2).Length + Encoding.encodeVL64(id_3).Length + Encoding.encodeVL64(count).Length)); int id_5 = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(id_1).Length + Encoding.encodeVL64(id_2).Length + Encoding.encodeVL64(id_3).Length + Encoding.encodeVL64(id_4).Length + Encoding.encodeVL64(count).Length)); if (count == 5 && id_1 != id_2 && id_2 != id_3 && id_3 != id_4 && id_4 != id_5) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.getInt("SELECT ownerid FROM furniture WHERE id = '" + id_1 + "'") == userID) dbClient.runQuery("UPDATE furniture SET ownerid = '-1' WHERE id = '" + id_1 + "' LIMIT 1"); else return; if (dbClient.getInt("SELECT ownerid FROM furniture WHERE id = '" + id_2 + "'") == userID) dbClient.runQuery("UPDATE furniture SET ownerid = '-1' WHERE id = '" + id_2 + "' LIMIT 1"); else return; if (dbClient.getInt("SELECT ownerid FROM furniture WHERE id = '" + id_3 + "'") == userID) dbClient.runQuery("UPDATE furniture SET ownerid = '-1' WHERE id = '" + id_3 + "' LIMIT 1"); else return; if (dbClient.getInt("SELECT ownerid FROM furniture WHERE id = '" + id_4 + "'") == userID) dbClient.runQuery("UPDATE furniture SET ownerid = '-1' WHERE id = '" + id_4 + "' LIMIT 1"); else return; if (dbClient.getInt("SELECT ownerid FROM furniture WHERE id = '" + id_5 + "'") == userID) dbClient.runQuery("UPDATE furniture SET ownerid = '-1' WHERE id = '" + id_5 + "' LIMIT 1"); else return; sendData("AC"); // Yey! Buying Successful dbClient.runQuery("INSERT INTO furniture(tid,ownerid,var) VALUES (1627," + userID + ",'" + DateTime.Now.ToString("yyyy-MM-dd") + "')"); int recyclingBoxID = 0; int receivementID = 0; recyclingBoxID = dbClient.getInt("SELECT MAX(id) FROM furniture"); int chance = 0; int randomID = new Random().Next(1, 10000); if (randomID > 9500 && chance == 0) chance = 200; if (randomID > 9150 && chance == 0) chance = 2000; if (randomID > 7500 && chance == 0) chance = 40; if (randomID > 5500 && chance == 0) chance = 5; int reward = dbClient.getInt("SELECT rclr_reward FROM system_recycler WHERE chance = '" + chance + "' ORDER BY RAND() LIMIT 1"); dbClient.runQuery("INSERT INTO furniture(tid,roomid,ownerid) VALUES (" + reward + ",'-1','" + userID + "')"); receivementID = dbClient.getInt("SELECT MAX(id) FROM furniture"); dbClient.runQuery("INSERT INTO furniture_presents(id,itemid) VALUES ('" + recyclingBoxID + "','" + receivementID + "')"); refreshHand("last"); sendData("G{HH"); } } } internal void ProcessPacketF464() // Recycler status { sendData("G{IH"); } internal void ProcessPacketF873() // Recycler rewards { sendData("Gz" + recyclerManager.rewardString); } internal void ProcessPacketAd() // Catalogue - purchase { /* Allow breakspaces */ if (currentPacket.Contains("\x03")) { currentPacket = currentPacket.Replace(Convert.ToChar(3).ToString(), Convert.ToChar(13).ToString()); } int catalogueIndex = 0; int spriteID = 0; catalogueIndex = Encoding.decodeVL64(currentPacket.Substring(2)); spriteID = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(catalogueIndex).Length)); int VarItem_B64 = 0; string VarItem = ""; VarItem_B64 = Encoding.decodeB64(currentPacket.Substring(2 + Encoding.encodeVL64(spriteID).Length + Encoding.encodeVL64(catalogueIndex).Length, 2)); VarItem = currentPacket.Substring(4 + Encoding.encodeVL64(spriteID).Length + Encoding.encodeVL64(catalogueIndex).Length, VarItem_B64); int presentCheck = 0; presentCheck = Encoding.decodeVL64(currentPacket.Substring(4 + Encoding.encodeVL64(spriteID).Length + Encoding.encodeVL64(catalogueIndex).Length + VarItem_B64, 1)); int receiverName_B64 = 0; string receiverName = ""; int presentDesc_B64 = 0; string presentDesc = ""; if (presentCheck == 1) { receiverName_B64 = Encoding.decodeB64(currentPacket.Substring(5 + Encoding.encodeVL64(spriteID).Length + Encoding.encodeVL64(catalogueIndex).Length + VarItem_B64, 2)); receiverName = currentPacket.Substring(7 + Encoding.encodeVL64(spriteID).Length + Encoding.encodeVL64(catalogueIndex).Length + VarItem_B64, receiverName_B64); presentDesc_B64 = Encoding.decodeB64(currentPacket.Substring(7 + receiverName_B64 + Encoding.encodeVL64(spriteID).Length + Encoding.encodeVL64(catalogueIndex).Length + VarItem_B64, 2)); presentDesc = currentPacket.Substring(9 + Encoding.encodeVL64(spriteID).Length + receiverName_B64 + Encoding.encodeVL64(catalogueIndex).Length + VarItem_B64, presentDesc_B64); } string Item = ""; int pageID = 0; int Cost = 0; int Cost_Pixels = 0; using (DatabaseClient dbClient1 = Eucalypt.dbManager.GetClient()) { dbClient1.AddParamWithValue("indexid", catalogueIndex); dbClient1.AddParamWithValue("tid", spriteID); pageID = dbClient1.getInt("SELECT indexid FROM catalogue_pages WHERE indexid = @indexid AND minrank <= " + _Rank); Item = dbClient1.getString("SELECT name_cct FROM catalogue_items WHERE tid = @tid"); Cost = dbClient1.getInt("SELECT catalogue_cost_credits FROM catalogue_items WHERE catalogue_id_page = '" + pageID + "' AND tid = '" + spriteID + "'"); Cost_Pixels = dbClient1.getInt("SELECT catalogue_cost_pixels FROM catalogue_items WHERE catalogue_id_page = '" + pageID + "' AND tid = '" + spriteID + "'"); if (Config.enableHappyHour == true) { Cost = 0; if (Cost_Pixels > 0) { Cost = 1; } Cost_Pixels = Cost_Pixels / 2; } } if (pageID == 0 || Cost > _Credits || Cost_Pixels > _Pixels) { sendData("AD" + Convert.ToChar(2)); return; } bool handlePresentbox = false; int receiverID = userID; int presentBoxID = 0; int roomID = 0; // -1 = present box, 0 = inhand if (Cost_Pixels > 0) // Can not buy as present if you pay with pixels presentCheck = 0; if (presentCheck == 1) // Purchased as present { handlePresentbox = true; using (DatabaseClient dbClient2 = Eucalypt.dbManager.GetClient()) { dbClient2.AddParamWithValue("name", receiverName); if (receiverName != _Username) { int i = dbClient2.getInt("SELECT id FROM users WHERE name = @name LIMIT 1"); if (i > 0) receiverID = i; else { sendData("AL" + receiverName); return; } } } string boxSprite = "present_gen" + new Random().Next(1, 7); string boxTemplateID; using (DatabaseClient dbClient1 = Eucalypt.dbManager.GetClient()) { boxTemplateID = dbClient1.getString("SELECT tid FROM catalogue_items WHERE name_cct = '" + boxSprite + "'"); dbClient1.AddParamWithValue("tid", boxTemplateID); dbClient1.AddParamWithValue("ownerid", receiverID); dbClient1.AddParamWithValue("var", "!" + stringManager.filterSwearwords(presentDesc)); dbClient1.runQuery("INSERT INTO furniture(tid,ownerid,var) VALUES (@tid,@ownerid,@var)"); presentBoxID = dbClient1.getInt("SELECT MAX(id) FROM furniture"); } roomID = -1; } _Credits -= Cost; _Pixels -= Cost_Pixels; sendData("@F" + _Credits); sendData("Fv" + Encoding.encodeVL64(_Pixels) + "H"); using (DatabaseClient dbClient1 = Eucalypt.dbManager.GetClient()) { dbClient1.runQuery("UPDATE users SET credits = '" + _Credits + "' WHERE id = '" + userID + "' LIMIT 1"); dbClient1.runQuery("UPDATE users SET pixels = '" + _Pixels + "' WHERE id = '" + userID + "' LIMIT 1"); } if (stringManager.getStringPart(Item, 0, 13) == "avatar_effect") { int effectID = int.Parse(Item.Replace("avatar_effect", "")); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { int effectDuration = dbClient.getInt("SELECT duration FROM system_effects WHERE effectid = " + effectID + " LIMIT 1"); dbClient.runQuery("INSERT INTO users_effects(userid,effect_id,effect_activated,effect_timemax,effect_timeleft) VALUES ('" + userID + "','" + effectID + "','" + 0 + "','" + effectDuration + "','" + effectDuration + "' )"); refreshEffect(); if (_activateBuy == true) { _activateBuy = false; Handler.ProcessPacket("Eu" + Encoding.encodeVL64(effectID)); Handler.ProcessPacket("Et" + Encoding.encodeVL64(effectID)); } } return; } if (stringManager.getStringPart(Item, 0, 4) != "deal") { int teleportid1 = 0; using (DatabaseClient dbClient1 = Eucalypt.dbManager.GetClient()) { dbClient1.runQuery("INSERT INTO furniture(tid,ownerid,roomid) VALUES ('" + spriteID + "','" + receiverID + "','" + roomID + "' )"); teleportid1 = catalogueManager.lastItemID; } if (catalogueManager.getTemplate(spriteID).Sprite == "wallpaper" || catalogueManager.getTemplate(spriteID).Sprite == "floor" || catalogueManager.getTemplate(spriteID).Sprite.Contains("landscape")) { string decorID = VarItem; catalogueManager.handlePurchase(spriteID, receiverID, 0, decorID, presentBoxID, 0); } else if ((stringManager.getStringPart(Item, 0, 11) == "greektrophy") || (stringManager.getStringPart(Item, 0, 11) == "prizetrophy")) { if (handlePresentbox == false) { using (DatabaseClient dbClient4 = Eucalypt.dbManager.GetClient()) { string vari = _Username + "\t" + DateTime.Today.ToShortDateString() + "\t" + stringManager.filterSwearwords(VarItem); vari = vari.Replace(@"\", "\\").Replace("'", @"\'"); dbClient4.runQuery("UPDATE furniture SET var = '" + vari + "' WHERE id = '" + catalogueManager.lastItemID + "' LIMIT 1"); } } else { using (DatabaseClient dbClient4 = Eucalypt.dbManager.GetClient()) { string vari = _Username + "\t" + DateTime.Today.ToShortDateString() + "\t" + stringManager.filterSwearwords(VarItem); vari = vari.Replace(@"\", "\\").Replace("'", @"\'"); dbClient4.runQuery("UPDATE furniture SET var = '" + vari + "' WHERE id = '" + catalogueManager.lastItemID + "' LIMIT 1"); dbClient4.runQuery("INSERT INTO furniture_presents(id,itemid) VALUES ('" + presentBoxID + "','" + teleportid1 + "')"); refreshHand("last"); return; } } } else if (stringManager.getStringPart(Item, 0, 3) == "pet") { string[] Props = VarItem.Split(Convert.ToChar(2)); // 0 = Name, 1 = Race, 2 = Colour string Name = Props[0]; string Race = Props[1]; string Colour = Props[2]; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("INSERT INTO pets (id, ownerid, name,type,colour, race) VALUES ('" + catalogueManager.lastItemID + "', '" + userID + "', '" + Name + "', '" + Item + "', '" + Colour + "', ' " + Race + "')"); } } else catalogueManager.handlePurchase(spriteID, receiverID, roomID, "0", presentBoxID, teleportid1); } if (receiverID == userID) refreshHand("last"); else if (userManager.containsUser(receiverID)) { userManager.getUser(receiverID).refreshHand("last"); } if (Config.enableBoughtMessage == true) sendData("AC"); // Yey! Buying Successful } #endregion #endregion #region Hand and item handling internal void ProcessPacketAA() // Hand { if (Room == null || roomUser == null) return; if (_receivedSpriteIndex == false) { sendData("DiH" + Convert.ToChar(1) + "DuH"); _receivedSpriteIndex = true; } string Mode = currentPacket.Substring(2); refreshHand(Mode); } internal void ProcessPacketLB() // Hand { if (Room == null || roomUser == null) return; string Mode = currentPacket.Substring(2); refreshHand(Mode); } internal void ProcessPacketAB() // Item handling - apply wallpaper/floor/landscape to room { if (_hasRights == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); int templateID; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { templateID = dbClient.getInt("SELECT tid FROM furniture WHERE id = '" + itemID + "' AND ownerid = '" + userID + "' AND roomid = '0'"); string decorType = catalogueManager.getTemplate(templateID).Sprite.Split(' ')[0]; if (decorType != "wallpaper" && decorType != "floor" && decorType != "landscape") // Non-valid decoration type return; string decorVal = dbClient.getString("SELECT var FROM furniture WHERE id = '" + itemID + "'"); Room.sendData("@n" + decorType + Convert.ToChar(2) + decorVal + Convert.ToChar(2)); // "@n" (46) is a generic message for setting a room's decoration. Since the introduction of landscapes, it can be 'wallpaper', 'floor' and 'landscape' dbClient.runQuery("UPDATE rooms SET " + decorType + " = '" + decorVal + "' WHERE id = '" + _roomID + "' LIMIT 1"); // Generates query like 'UPDATE rooms SET floor/wallpaper/landscape blabla' (the string decorType is containing either 'floor', 'wallpaper' or 'landscape') dbClient.runQuery("DELETE FROM furniture WHERE id = '" + itemID + "' LIMIT 1"); } } internal void ProcessPacketAZ() // Item handling - place item down { if (_hasRights == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = 0; if (!int.TryParse((currentPacket.Split(' ')[0].Substring(4)), out itemID)) return; int templateID; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) templateID = dbClient.getInt("SELECT tid FROM furniture WHERE id = '" + itemID + "' AND ownerid = '" + userID + "' AND roomid = '0'"); if (templateID == 0) return; if (catalogueManager.getTemplate(templateID).typeID == 0) { string _INPUTPOS = currentPacket.Substring(itemID.ToString().Length + 5); string _CHECKEDPOS = catalogueManager.wallPositionOK(_INPUTPOS); if (_CHECKEDPOS != _INPUTPOS) { return; } string Var; int VarValue = 0; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { Var = dbClient.getString("SELECT var FROM furniture WHERE id = '" + itemID + "'"); Int32.TryParse(Var, out VarValue); if (stringManager.getStringPart(catalogueManager.getTemplate(templateID).Sprite, 0, 7) == "post.it") { if (VarValue > 1) dbClient.runQuery("UPDATE furniture SET var = var - 1 WHERE id = '" + itemID + "' LIMIT 1"); else dbClient.runQuery("DELETE FROM furniture WHERE id = '" + itemID + "' LIMIT 1"); dbClient.runQuery("INSERT INTO furniture(tid,ownerid) VALUES ('" + templateID + "','" + userID + "')"); itemID = catalogueManager.lastItemID; dbClient.runQuery("INSERT INTO furniture_stickies(id) VALUES ('" + itemID + "')"); Var = "FFFF33"; dbClient.runQuery("UPDATE furniture SET var = '" + Var + "' WHERE id = '" + itemID + "' LIMIT 1"); } else if (stringManager.getStringPart(catalogueManager.getTemplate(templateID).Sprite, 0, 10) == "roomdimmer") dbClient.runQuery("UPDATE furniture_moodlight SET roomid = '" + _roomID + "' WHERE id = '" + itemID + "' LIMIT 1"); Room.wallItemManager.addItem(itemID, templateID, _CHECKEDPOS, Var, true); } } else { 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.getTemplate(templateID).typeID; Room.floorItemManager.placeItem(itemID, templateID, X, Y, typeID, Z, _stackRugs); } } internal void ProcessPacketAC() // Item handling - pickup item { if (_isOwner == false || _inPublicroom || Room == null || roomUser == null) return; int itemAct = Encoding.decodeVL64(currentPacket.Substring(2)); int itemID = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(itemAct).Length)); 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("last"); } internal void ProcessPacketAI() // Item handling - move/rotate item { if (_hasRights == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); if (Room.floorItemManager.containsItem(itemID)) { int X = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(itemID).Length)); // X position int Y = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(itemID).Length + Encoding.encodeVL64(X).Length)); // Y position byte Z = Convert.ToByte(Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(itemID).Length + Encoding.encodeVL64(X).Length + Encoding.encodeVL64(Y).Length))); // Rotation direction NOT HEIGHT Room.floorItemManager.relocateItem(itemID, X, Y, Z); } } internal void ProcessPacketFI() // Item handling - toggle wallitem status { try { if (_inPublicroom || Room == null || roomUser == null) return; int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); Rooms.Items.wallItem Item = Room.wallItemManager.getItem(itemID); catalogueManager.itemTemplate Template = catalogueManager.getTemplate(Item.templateID); int toStatus = 0; /* Check if the furniture requires that the user has rights */ if (Template.rightsRequired == 1) if (_hasRights == false) return; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { toStatus = dbClient.getInt("SELECT var FROM furniture WHERE id = " + itemID + " LIMIT 1"); if (toStatus == 1) { toStatus = 0; } else { toStatus = 1; } } Room.wallItemManager.toggleItemStatus(itemID, toStatus); return; } catch { } } internal void ProcessPacketFH() // Item handling - toggle flooritem status { try { int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); string toStatus = currentPacket.Substring(Encoding.encodeVL64(itemID).Length + 2); Rooms.Items.floorItem Item = Room.floorItemManager.getItem(itemID); /* Check if the furniture requires that the user is behind the furniture */ catalogueManager.itemTemplate Template = catalogueManager.getTemplate(Item.templateID); if (!(Math.Abs(roomUser.X - Item.X) > 1 || Math.Abs(roomUser.Y - Item.Y) > 1)) // User is not more than one square removed from a special furniture { } else { if (Template.nexttoRequired == 1) return; } //Check if this furniture is signed as teleporter if (Template.maxStatus == -1) { // Prevent clientside 'jumps' to teleporter, check if user is removed one coord from teleporter entrance if (Item.Z == 2) { if (roomUser.X != Item.X + 1) return; if (Item.Y != roomUser.Y) return; } else if (Item.Z == 0) { if (roomUser.Y != Item.Y - 1) return; if (Item.X != roomUser.X) return; } else if (Item.Z == 4) { if (roomUser.Y != Item.Y + 1) return; if (Item.X != roomUser.X) return; } roomUser.goalX = -1; Room.sendData("AX" + itemID + Convert.ToChar(2) + 1 + Convert.ToChar(2)); Room.moveUser(this.roomUser, Item.X, Item.Y, true); int roomIDTeleporter2; int idTeleporter2; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { idTeleporter2 = dbClient.getInt("SELECT teleportid FROM furniture WHERE id = '" + itemID + "'"); roomIDTeleporter2 = dbClient.getInt("SELECT roomid FROM furniture WHERE id = '" + idTeleporter2 + "'"); } if (roomIDTeleporter2 > 0) new TeleporterUsageSleep(useTeleporter).BeginInvoke(Item, idTeleporter2, roomIDTeleporter2, null, null); else Room.sendData("AX" + itemID + Convert.ToChar(2) + 0 + Convert.ToChar(2), 750); return; } /* Check if the furniture requires that the user has rights */ if (Template.rightsRequired == 1) if (_hasRights == false) return; if (Template.drinkIDs != "") { Room.sendData("G`" + Encoding.encodeVL64(roomUser.roomUID) + Encoding.encodeVL64(0)); if (Template.drinkIDs.Contains("\n")) { string handItem; handItem = Template.drinkIDs.Split('\r')[0]; handItem = handItem.Replace("\n", ""); int rndNum = new Random().Next(1, int.Parse(handItem)); handItem = Template.drinkIDs.Split('\r')[rndNum]; handItem = handItem.Replace("\n", ""); statusManager.carryItem(int.Parse(handItem)); } else { statusManager.carryItem(int.Parse(Template.drinkIDs)); } } if (Encoding.decodeVL64(toStatus) > 0 | Encoding.decodeVL64(toStatus) < 10) Room.floorItemManager.toggleItemStatus(itemID, toStatus, _hasRights); else return; } catch { } return; } internal void ProcessPacketAN() // Item handling - open presentbox { string tmpStatus = "s"; if (_isOwner == false || _inPublicroom || Room == null || roomUser == null) return; int itemID = Encoding.decodeVL64(Convert.ToString(currentPacket.Substring(2))); if (Room.floorItemManager.containsItem(itemID) == false) return; DataColumn dCol; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dCol = dbClient.getColumn("SELECT itemid FROM furniture_presents WHERE id = '" + itemID + "'"); if (dCol.Table.Rows.Count > 0) { StringBuilder sb = new StringBuilder(); int lastItemID = 0; foreach (DataRow dRow in dCol.Table.Rows) { sb.Append(" OR id = '" + Convert.ToString(dRow["itemid"]) + "'"); lastItemID = Convert.ToInt32(dRow["itemid"]); } dbClient.runQuery("UPDATE furniture SET roomid = '-' WHERE " + sb.ToString().Substring(4)); Room.floorItemManager.removeItem(itemID, 0); int lastItemTID = dbClient.getInt("SELECT tid FROM furniture WHERE id = '" + lastItemID + "'"); catalogueManager.itemTemplate Template = catalogueManager.getTemplate(lastItemTID); if (Template.typeID > 0) tmpStatus = "s"; else tmpStatus = "i"; if (Template.typeID > 0) sendData("BA" + tmpStatus + Convert.ToChar(2) + Encoding.encodeVL64(Template.indexID)); else sendData("BA" + tmpStatus + Convert.ToChar(2) + Encoding.encodeVL64(Template.indexID)); } dbClient.runQuery("DELETE FROM furniture_presents WHERE id = '" + itemID + "' LIMIT " + dCol.Table.Rows.Count); dbClient.runQuery("DELETE FROM furniture WHERE id = '" + itemID + "' LIMIT 1"); } refreshHand("last"); } internal void ProcessPacketBw() // 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_" && Sprite.Substring(0, 4).ToLower() != "cfc_") 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.runQuery("UPDATE users SET credits = '" + _Credits + "' WHERE id = '" + userID + "' LIMIT 1"); } } } internal void ProcessPacketCh() // FIXED BY BJORK !! { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); Rooms.Items.floorItem Item = Room.floorItemManager.getItem(itemID); // Find the item. try { if (Room.floorItemManager.containsItem(itemID) && stringManager.getStringPart(Item.Sprite, 0, 12) == "one_way_door") { if (Item.Sprite == "one_way_door*5") // Beige one way door { int corp_id; int secure_id; int corphq; int userisarrested; int isworking; int global_job; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { corp_id = dbClient.getInt("SELECT corp_id FROM users WHERE name = '" + _Username + "'"); secure_id = dbClient.getInt("SELECT secure_id FROM users WHERE name = '" + _Username + "'"); isworking = dbClient.getInt("SELECT working FROM users WHERE name = '" + _Username + "'"); corphq = dbClient.getInt("SELECT room_id FROM jobs_rooms WHERE rank_id = '" + secure_id + "' && room_id = '" + _roomID + "'"); userisarrested = dbClient.getInt("SELECT arrested FROM users WHERE name = '" + _Username + "'"); global_job = dbClient.getInt("SELECT global FROM jobs_ranks WHERE id = '" + secure_id + "'"); } if (corphq != _roomID && corp_id != 1) { sendData("BK" + "you need to work here" + Convert.ToChar(2)); return; } if (isworking == 0) { sendData("BK" + "you need to have started working" + Convert.ToChar(2)); return; } } if (Item.Sprite == "one_way_door*3") // Black One Way Door { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Credits < 5) { sendData("BK" + "you need 5 coins." + Convert.ToChar(2)); return; } string roomOwner; roomOwner = dbClient.getString("SELECT owner FROM rooms WHERE id = '" + _roomID + "'"); dbClient.runQuery("UPDATE users SET credits = credits + '5' WHERE name = '" + roomOwner + "'"); dbClient.runQuery("UPDATE users SET credits = credits - '5' WHERE name = '" + _Username + "'"); refreshValueables(true, false); sendData("BK" + "you payed 5 coins." + Convert.ToChar(2)); } } if (Item.Sprite == "one_way_door*1") // Aqua One way door { int userisarrested; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { userisarrested = dbClient.getInt("SELECT arrested FROM users WHERE name = '" + _Username + "'"); if (userisarrested == 1) { sendData("BK" + "sorry, you can't use this gate." + Convert.ToChar(2)); return; } } } if (Item.Sprite == "one_way_door*9") // Red One way Door { if (_Rank < 2) { sendData("BK" + "you need to be vip" + Convert.ToChar(2)); return; } } Room.sendData("Dx" + Encoding.encodeVL64(itemID) + "I" + Encoding.encodeVL64(Room.roomID)); // Opens the gate, with green light Room.setSquareState(Item.X, Item.Y, 1, 1, virtualRoom.squareState.Open); roomUser.walkLock = true; switch (Item.Z) // Walk into the item { case 0: roomUser.goalY = Room.sqSTATE[Item.X, Item.Y + 1] == virtualRoom.squareState.Blocked ? Item.Y : Item.Y + 1; roomUser.goalX = Item.X; break; case 2: roomUser.goalX = Room.sqSTATE[Item.X - 1, Item.Y] == virtualRoom.squareState.Blocked ? Item.X : Item.X - 1; roomUser.goalY = Item.Y; break; case 4: roomUser.goalY = Room.sqSTATE[Item.X, Item.Y - 1] == virtualRoom.squareState.Blocked ? Item.Y : Item.Y - 1; roomUser.goalX = Item.X; break; case 6: roomUser.goalX = Room.sqSTATE[Item.X + 1, Item.Y] == virtualRoom.squareState.Blocked ? Item.X : Item.X + 1; roomUser.goalY = Item.Y; break; } roomUser.walkLock = false; while (true) if (roomUser.statusManager.containsStatus("mv")) break; Room.sendData("Dx" + Encoding.encodeVL64(itemID) + "H" + Encoding.encodeVL64(Room.roomID), 1000); Room.setSquareState(Item.X, Item.Y, 1, 1, virtualRoom.squareState.Blocked); return; } } catch { } return; } internal void ProcessPacketAM() // Item handling - dices - close dice { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = Encoding.decodeVL64(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" + Encoding.encodeVL64(itemID) + Encoding.encodeVL64(0)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE furniture SET var = '0' WHERE id = '" + itemID + "' LIMIT 1"); } } } } internal void ProcessPacketAL() // Item handling - dices - spin dice { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = Encoding.decodeVL64(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" && Sprite != "bottle") // Not a bottle or a dice item return; if (!(Math.Abs(roomUser.X - Item.X) > 1 || Math.Abs(roomUser.Y - Item.Y) > 1) || Sprite == "bottle") // User is not more than one square removed from dice { Room.sendData("AZ" + Encoding.encodeVL64(itemID) + "M"); int rndNum = new Random(DateTime.Now.Millisecond).Next(1, 7); Room.sendData("AZ" + Encoding.encodeVL64(itemID) + Encoding.encodeVL64(rndNum), 2000); Item.Var = rndNum.ToString(); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE furniture SET var = '" + rndNum + "' WHERE id = '" + itemID + "' LIMIT 1"); } } } } internal void ProcessPacketCw() // Item handling - spin Wheel of fortune { if (_hasRights == false || Room == null || roomUser == null || _inPublicroom) return; int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); if (Room.wallItemManager.containsItem(itemID)) { Rooms.Items.wallItem Item = Room.wallItemManager.getItem(itemID); if (Item.Sprite == "habbowheel" || Item.Sprite == "ads_lin_wh_c") { int rndNum = new Random(DateTime.Now.Millisecond).Next(0, 10); catalogueManager.itemTemplate Template = catalogueManager.getTemplate(Item.templateID); Room.sendData("AU" + itemID + Convert.ToChar(2) + Encoding.encodeVL64(Template.indexID) + Item.wallPosition + Convert.ToChar(2) + "-1" + Convert.ToChar(2)); Room.sendData("AU" + itemID + Convert.ToChar(2) + Encoding.encodeVL64(Template.indexID) + Item.wallPosition + Convert.ToChar(2) + rndNum + Convert.ToChar(2)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE furniture SET var = '" + rndNum + "' WHERE id = '" + itemID + "' LIMIT 1"); } } } } internal void ProcessPacketDz() // Item handling - activate Love shuffler sofa { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); 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.runQuery("UPDATE furniture SET var = '" + rndNum + "' WHERE id = '" + itemID + "' LIMIT 1"); } } } internal void ProcessPacketAS() // Item handling - stickies/photo's - open stickie/photo { if (Room == null || roomUser == null || _inPublicroom) return; int itemID = int.Parse(currentPacket.Substring(2)); if (Room.wallItemManager.containsItem(itemID)) { string Message; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { Message = dbClient.getString("SELECT text FROM furniture_stickies WHERE id = '" + itemID + "'"); } sendData("@p" + itemID + Convert.ToChar(9) + Room.wallItemManager.getItem(itemID).Var + " " + Message + Convert.ToChar(2)); } } internal void ProcessPacketAT() // Item handling - stickies - edit stickie colour/message { /* Allow breakspaces */ 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; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("text", stringManager.filterSwearwords(Message).Replace("/r", Convert.ToChar(13).ToString())); if (Colour != Item.Var) dbClient.runQuery("UPDATE furniture SET var = '" + Colour + "' WHERE id = '" + itemID + "' LIMIT 1"); Item.Var = Colour; dbClient.runQuery("UPDATE furniture_stickies SET text = @text WHERE id = '" + itemID + "' LIMIT 1"); } Room.sendData("AU" + itemID + Convert.ToChar(9) + Sprite + Convert.ToChar(9) + " " + Item.wallPosition + Convert.ToChar(9) + Colour + Convert.ToChar(2)); } } internal void ProcessPacketAU() // Item handling - stickies/photo - delete stickie/photo { if (_isOwner == false || Room == null || roomUser == null || _inPublicroom) return; int itemID = int.Parse(currentPacket.Substring(2)); 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.runQuery("DELETE FROM furniture_stickies WHERE id = '" + itemID + "' LIMIT 1"); } } } #endregion #region Soundmachines internal void ProcessPacketCt() // Soundmachine - initialize songs in soundmachine { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) sendData("EB" + soundMachineManager.getMachineSongList(Room.floorItemManager.soundMachineID)); } internal void ProcessPacketCu() // Soundmachine - enter room initialize playlist { if (Room != null && Room.floorItemManager.soundMachineID > 0) sendData("EC" + soundMachineManager.getMachinePlaylist(Room.floorItemManager.soundMachineID)); } internal void ProcessPacketCPAR() // Soundmachine - get song title and data of certain song C] { if (Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Encoding.decodeVL64(currentPacket.Substring(2)); sendData("Dl" + soundMachineManager.getSong(songID)); } } internal void ProcessPacketCs() // Soundmachine - save playlist { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int Amount = Encoding.decodeVL64(currentPacket.Substring(2)); if (Amount < 6) // Max playlist size { currentPacket = currentPacket.Substring(Encoding.encodeVL64(Amount).Length + 2); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM soundmachine_playlists WHERE machineid = '" + Room.floorItemManager.soundMachineID + "'"); } StringBuilder sb = new StringBuilder(); for (int i = 0; i < Amount; i++) { int songID = Encoding.decodeVL64(currentPacket); sb.Append(" ,('" + Room.floorItemManager.soundMachineID + "','" + songID + "','" + i + "')"); currentPacket = currentPacket.Substring(Encoding.encodeVL64(songID).Length); } if (sb.Length != 0) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("INSERT INTO soundmachine_playlists(machineid,songid,pos) VALUES " + sb.ToString().Substring(2)); } } Room.sendData("EC" + soundMachineManager.getMachinePlaylist(Room.floorItemManager.soundMachineID)); // Refresh playlist } } } internal void ProcessPacketCCA() // Sound machine - burn song to disk C~ { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Encoding.decodeVL64(currentPacket.Substring(2)); bool result = false; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { result = dbClient.findsResult("SELECT id FROM soundmachine_songs WHERE id = '" + songID + "' AND userid = '" + userID + "' AND machineid = '" + Room.floorItemManager.soundMachineID + "'"); } if (_Credits > 0 && result) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { DataRow dRow = dbClient.getRow("SELECT title, length FROM soundmachine_songs WHERE id = '" + songID + "'"); string Status = Encoding.encodeVL64(songID) + _Username + "\n" + DateTime.Today.Day + "\n" + DateTime.Today.Month + "\n" + DateTime.Today.Year + "\n" + Convert.ToString(dRow["length"]) + "\n" + Convert.ToString(dRow["title"]); dbClient.AddParamWithValue("tid", Config.Soundmachine_burnToDisk_diskTemplateID); dbClient.AddParamWithValue("ownerid", userID); dbClient.AddParamWithValue("var", Status); dbClient.runQuery("INSERT INTO furniture(tid,ownerid,var) VALUES (@tid,@ownerid,@var)"); dbClient.runQuery("UPDATE soundmachine_songs SET burnt = '1' WHERE id = '" + songID + "' LIMIT 1"); dbClient.runQuery("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"); } } internal void ProcessPacketCx() // Sound machine - delete song { if (_isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Encoding.decodeVL64(currentPacket.Substring(2)); bool result = false; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { result = dbClient.findsResult("SELECT id FROM soundmachine_songs WHERE id = '" + songID + "' AND machineid = '" + Room.floorItemManager.soundMachineID + "'"); } if (result) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("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.runQuery("DELETE FROM soundmachine_songs WHERE id = '" + songID + "' AND burnt = '0' LIMIT 1"); // If the song isn't burnt; delete song from database dbClient.runQuery("DELETE FROM soundmachine_playlists WHERE machineid = '" + Room.floorItemManager.soundMachineID + "' AND songid = '" + songID + "'"); // Remove song from playlist } Room.sendData("EC" + soundMachineManager.getMachinePlaylist(Room.floorItemManager.soundMachineID)); } } } #region Song editor internal void ProcessPacketCo() // 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)); } } internal void ProcessPacketCPAR21() // Soundmachine - song editor - add soundset C[ { 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()); } } } internal void ProcessPacketCSL() // Soundmachine - song editor - remove soundset C\ { 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)); } } } internal void ProcessPacketCp() // Soundmachine - song editor - save new song { if (songEditor != null && _isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int nameLength = Encoding.decodeB64(currentPacket.Substring(2, 2)); string Title = currentPacket.Substring(4, nameLength); string Data = currentPacket.Substring(nameLength + 6); 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", stringManager.filterSwearwords(Title)); dbClient.AddParamWithValue("length", Length); dbClient.AddParamWithValue("data", Data); //dbClient.Open(); dbClient.runQuery("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)); } } } internal void ProcessPacketCq() // 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); sendData("Dm" + songEditor.getSoundsets()); sendData("Dn" + soundMachineManager.getHandSoundsets(userID)); } } internal void ProcessPacketCr() // Soundmachine - song editor - save edited existing song { if (songEditor != null && _isOwner && Room != null && Room.floorItemManager.soundMachineID > 0) { int songID = Encoding.decodeVL64(currentPacket.Substring(2)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("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("id", songID); dbClient.AddParamWithValue("title", stringManager.filterSwearwords(Title)); dbClient.AddParamWithValue("length", Length); dbClient.AddParamWithValue("data", Data); dbClient.runQuery("UPDATE soundmachine_songs SET title = @title,data = @data,length = @length WHERE id = @id LIMIT 1"); sendData("ES"); sendData("EB" + soundMachineManager.getMachineSongList(Room.floorItemManager.soundMachineID)); Room.sendData("EC" + soundMachineManager.getMachinePlaylist(Room.floorItemManager.soundMachineID)); } } } } } #endregion Song editor #endregion #region Trading internal void ProcessPacketAG() // Trading - start { if (Room != null || roomUser != null || _tradePartnerRoomUID == -1) { if (Config.enableTrading == false) { sendData("BK" + stringManager.getString("trading_disabled") + Convert.ToChar(2)); return; } int partnerUID = Encoding.decodeVL64(currentPacket.Substring(2)); if (Room.containsUser(partnerUID)) { virtualUser Partner = Room.getUser(partnerUID); if (Partner.statusManager.containsStatus("trd")) return; this._tradePartnerRoomUID = partnerUID; this.statusManager.addStatus("trd", ""); this.roomUser.Refresh(); Partner._tradePartnerRoomUID = this.roomUser.roomUID; Partner.statusManager.addStatus("trd", ""); Partner.roomUser.Refresh(); Partner.sendData("Ah" + Encoding.encodeVL64(this.userID) + "I" + Encoding.encodeVL64(Partner.userID) + "I"); this.sendData("Ah" + Encoding.encodeVL64(Partner.userID) + "I" + Encoding.encodeVL64(this.userID) + "I"); } } } internal void ProcessPacketAH() // Trading - offer item { if (Room != null && roomUser != null && _tradePartnerRoomUID != -1 && Room.containsUser(_tradePartnerRoomUID)) { int itemID = Encoding.decodeVL64(currentPacket.Substring(2)); int templateID; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { templateID = dbClient.getInt("SELECT tid FROM furniture WHERE id = '" + itemID + "' AND ownerid = '" + userID + "' AND roomid = '0'"); } if (templateID == 0) return; _tradeItems[_tradeItemCount] = itemID; _tradeItemCount++; virtualUser Partner = Room.getUser(_tradePartnerRoomUID); this._tradeAccept = false; Partner._tradeAccept = false; this.refreshTradeBoxes(); Partner.refreshTradeBoxes(); } } internal void ProcessPacketAD() // Trading - decline trade { if (Room != null && roomUser != null && _tradePartnerRoomUID != -1 && Room.containsUser(_tradePartnerRoomUID)) { virtualUser Partner = Room.getUser(_tradePartnerRoomUID); this._tradeAccept = false; Partner._tradeAccept = false; this.refreshTradeBoxes(); Partner.refreshTradeBoxes(); abortTrade(); this.sendData("Am" + Encoding.encodeVL64(this.userID) + "H"); Partner.sendData("Am" + Encoding.encodeVL64(this.userID) + "H"); } } internal void ProcessPacketAE() // Trading - accept trade (and, if both partners accept, swap items] { if (Room != null && roomUser != null && _tradePartnerRoomUID != -1 && Room.containsUser(_tradePartnerRoomUID)) { virtualUser Partner = Room.getUser(_tradePartnerRoomUID); this._tradeAccept = true; this.sendData("Am" + Encoding.encodeVL64(this.userID) + "I"); Partner.sendData("Am" + Encoding.encodeVL64(this.userID) + "I"); if (Partner._tradeAccept) { this._tradeConfirm = false; Partner._tradeConfirm = false; this.sendData("Ao"); Partner.sendData("Ao"); } } } internal void ProcessPacketFS() { ProcessPacketAF(); } internal void ProcessPacketAF() // Trading - abort trade { if (Room != null && roomUser != null && _tradePartnerRoomUID != -1 && Room.containsUser(_tradePartnerRoomUID)) { abortTrade(); refreshHand("update"); } } internal void ProcessPacketFR() { if (Room != null && roomUser != null && _tradePartnerRoomUID != -1 && Room.containsUser(_tradePartnerRoomUID)) { virtualUser Partner = Room.getUser(_tradePartnerRoomUID); this._tradeConfirm = true; this.sendData("Am" + Encoding.encodeVL64(this.userID) + "I"); Partner.sendData("Am" + Encoding.encodeVL64(this.userID) + "I"); if (Partner._tradeConfirm) { Random tradeid = new Random(); string tradeidis = this._Username + "-" + Convert.ToString(tradeid.Next(1000000, 9999999)) + "-" + Partner._Username; StringBuilder sb = new StringBuilder("'a'='b'"); for (int i = 0; i < _tradeItemCount; i++) { if (_tradeItems[i] > 0) { sb.Append(" OR id = '" + this._tradeItems[i] + "'"); } } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE furniture SET ownerid = '" + Partner.userID + "',roomid = '0' WHERE" + sb.ToString()); } sb.Remove(7, sb.Length - 7); for (int i = 0; i < Partner._tradeItemCount; i++) { if (Partner._tradeItems[i] > 0) { sb.Append(" OR id = '" + Partner._tradeItems[i] + "'"); } } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE furniture SET ownerid = '" + this.userID + "',roomid = '0' WHERE" + sb.ToString()); } abortTrade(); } } } #endregion #region Games internal void ProcessPacketB_() // Gamelobby - refresh gamelist B_ { if (Room != null && Room.Lobby != null) sendData("Ch" + Room.Lobby.gameList()); } internal void ProcessPacketBUT() // Gamelobby - checkout single game sub B` { if (Room != null && roomUser != null && Room.Lobby != null && gamePlayer == null) { int gameID = Encoding.decodeVL64(currentPacket.Substring(2)); if (Room.Lobby.Games.ContainsKey(gameID)) { this.gamePlayer = new gamePlayer(this, roomUser.roomUID, (Game)Room.Lobby.Games[gameID]); gamePlayer.Game.Subviewers.Add(gamePlayer); sendData("Ci" + gamePlayer.Game.Sub); } } } internal void ProcessPacketBb() // Gamelobby - request new game create { if (Room != null && roomUser != null && Room.Lobby != null && gamePlayer == null) { if (_Tickets > 1) // Atleast two tickets in inventory { if (Room.Lobby.validGamerank(roomUser.gamePoints)) { if (Room.Lobby.isBattleBall) sendData("Ck" + Room.Lobby.getCreateGameSettings()); else sendData("Ck" + "RA" + "secondsUntilRestart" + Convert.ToChar(2) + "HIRGIHHfieldType" + Convert.ToChar(2) + "HKIIIISAnumTeams" + Convert.ToChar(2) + "HJJIII" + "PA" + "gameLengthChoice" + Convert.ToChar(2) + "HJIIIIK" + "name" + Convert.ToChar(2) + "IJ" + Convert.ToChar(2) + "H" + "secondsUntilStart" + Convert.ToChar(2) + "HIRBIHH"); } else sendData("Cl" + "K"); // Error [3] = Skillevel not valid in this lobby } else sendData("Cl" + "J"); // Error [2] = Not enough tickets } } internal void ProcessPacketBc() // Gamelobby - process new created game { if (Room != null && roomUser != null && Room.Lobby != null && gamePlayer == null) { if (_Tickets > 1) // Atleast two tickets in inventory { if (Room.Lobby.validGamerank(roomUser.gamePoints)) { try { int mapID = -1; int teamAmount = -1; int[] Powerups = null; string Name = ""; #region Game settings decoding int keyAmount = Encoding.decodeVL64(currentPacket.Substring(2)); currentPacket = currentPacket.Substring(Encoding.encodeVL64(keyAmount).Length + 2); for (int i = 0; i < keyAmount; i++) { int j = Encoding.decodeB64(currentPacket.Substring(0, 2)); string Key = currentPacket.Substring(2, j); if (currentPacket.Substring(j + 2, 1) == "H") // VL64 value { int Value = Encoding.decodeVL64(currentPacket.Substring(j + 3)); switch (Key) { case "fieldType": mapID = Value; break; case "numTeams": teamAmount = Value; break; } int k = Encoding.encodeVL64(Value).Length; currentPacket = currentPacket.Substring(j + k + 3); } else // B64 value { int valLen = Encoding.decodeB64(currentPacket.Substring(j + 3, 2)); string Value = currentPacket.Substring(j + 5, valLen); switch (Key) { case "allowedPowerups": string[] ps = Value.Split(','); Powerups = new int[ps.Length]; for (int p = 0; p < ps.Length; p++) { int P = int.Parse(ps[p]); if (Room.Lobby.allowsPowerup(P)) Powerups[p] = P; else // Powerup not allowed in this lobby return; } break; case "name": Name = stringManager.filterSwearwords(Value); break; } currentPacket = currentPacket.Substring(j + valLen + 5); } } #endregion if (mapID == -1 || teamAmount == -1 || Name == "") // Incorrect keys supplied by client return; this.gamePlayer = new gamePlayer(this, roomUser.roomUID, null); Room.Lobby.createGame(this.gamePlayer, Name, mapID, teamAmount, Powerups); } catch { } } else sendData("Cl" + "K"); // Error [3] = Skillevel not valid in this lobby } else sendData("Cl" + "J"); // Error [2] = Not enough tickets } } internal void ProcessPacketBe() // Gamelobby - switch team in game { if (Room != null && Room.Lobby != null && gamePlayer != null && gamePlayer.Game.State == Game.gameState.Waiting) { if (_Tickets > 1) // Atleast two tickets in inventory { if (Room.Lobby.validGamerank(roomUser.gamePoints)) { int j = Encoding.decodeVL64(currentPacket.Substring(2)); int teamID = Encoding.decodeVL64(currentPacket.Substring(Encoding.encodeVL64(j).Length + 2)); if (teamID != gamePlayer.teamID && gamePlayer.Game.teamHasSpace(teamID)) { if (gamePlayer.teamID == -1) // User was a subviewer gamePlayer.Game.Subviewers.Remove(gamePlayer); gamePlayer.Game.movePlayer(gamePlayer, gamePlayer.teamID, teamID); } else sendData("Cl" + "H"); // Error [0] = Team full } else sendData("Cl" + "K"); // Error [3] = Skillevel not valid in this lobby } else sendData("Cl" + "J"); // Error [2] = Not enough tickets } } internal void ProcessPacketBg() // Gamelobby - leave single game sub { leaveGame(); } internal void ProcessPacketBh() // Gamelobby - kick player from game { if (Room != null && Room.Lobby != null && gamePlayer != null && gamePlayer.Game != null && gamePlayer == gamePlayer.Game.Owner) { int roomUID = Encoding.decodeVL64(currentPacket.Substring(2)); for (int i = 0; i < gamePlayer.Game.Teams.Length; i++) { foreach (gamePlayer Member in gamePlayer.Game.Teams[i]) { if (Member.roomUID == roomUID) { Member.sendData("Cl" + "RA"); // Error [6] = kicked from game gamePlayer.Game.movePlayer(Member, i, -1); return; } } } } } internal void ProcessPacketBj() // Gamelobby - start game { if (Room != null && Room.Lobby != null && gamePlayer != null && gamePlayer == gamePlayer.Game.Owner) { gamePlayer.Game.startGame(); } } internal void ProcessPacketBk() // Game - ingame - move unit { if (gamePlayer != null && gamePlayer.Game.State == Game.gameState.Started && gamePlayer.teamID != -1) { gamePlayer.goalX = Encoding.decodeVL64(currentPacket.Substring(3)); gamePlayer.goalY = Encoding.decodeVL64(currentPacket.Substring(Encoding.encodeVL64(gamePlayer.goalX).Length + 3)); } } internal void ProcessPacketBl() // Game - ingame - proceed with restart of game { if (gamePlayer != null && gamePlayer.Game.State == Game.gameState.Ended && gamePlayer.teamID != -1) { gamePlayer.Game.sendData("BK" + "" + _Username + " wants to replay!"); } } #endregion #region Tutorial & Guide system internal void ProcessPacketEd() { if (_inPublicroom == true) return; _guideCount = 0; _guideRoom = Room.roomID; _guideSearch = true; _guideFinish = 0; userManager.sendToGuides(userID, Room.roomID, "Ec" + userID + Convert.ToChar(2) + _Username + Convert.ToChar(2)); sendData("Fe"); } internal void ProcessPacketEg() { if (_inPublicroom == true) return; _guideFinish = -1; _guideCount = 0; _guideRoom = 0; _guideSearch = false; userManager.sendToGuides(userID, 0, "Eh" + userID + Convert.ToChar(2)); return; } internal void ProcessPacketEe() { _guideCount = 0; virtualUser toVirtualUser = userManager.getUser(_guideRequest); if (toVirtualUser._isLoggedIn && _guideRoom > 0) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET guide_points = guide_points + 1 WHERE id = " + userID); } toVirtualUser.sendData("Fg" + Encoding.encodeVL64(userID)); sendData("D^" + "H" + Encoding.encodeVL64(_guideRoom) + Convert.ToChar(2)); } } internal void ProcessPacketDy() { if (currentPacket.Substring(2) == "PB") { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.getInt("SELECT guide_allowed FROM users WHERE id = " + userID) == 1) { dbClient.runQuery("UPDATE users SET guide_allowed = '0' WHERE id = '" + userID + "' LIMIT 1"); sendData("Ed" + "I"); } } } } internal void ProcessPacketEj() { _guideRequest = 0; } internal void ProcessPacketEk() { _guideRequest = -1; } #endregion #region Games Joystick internal void ProcessPacket_B() // Gamelobby - refresh gamelist { if (Room != null && Room.Lobby != null) sendData("Ch" + Room.Lobby.gameList()); } internal void ProcessPacket_TH() // Gamelobby - checkout single game sub { if (Room != null && roomUser != null && Room.Lobby != null && gamePlayer == null) { int gameID = Encoding.decodeVL64(currentPacket.Substring(2)); if (Room.Lobby.Games.ContainsKey(gameID)) { this.gamePlayer = new gamePlayer(this, roomUser.roomUID, (Game)Room.Lobby.Games[gameID]); gamePlayer.Game.Subviewers.Add(gamePlayer); sendData("Ci" + gamePlayer.Game.Sub); } } } internal void ProcessPacket_b() // Gamelobby - request new game create { if (Room != null && roomUser != null && Room.Lobby != null && gamePlayer == null) { if (Room.Lobby.validGamerank(roomUser.gamePoints)) { if (Room.Lobby.isBattleBall) sendData("Ck" + Room.Lobby.getCreateGameSettings()); else sendData("Ck" + "RA" + "secondsUntilRestart" + Convert.ToChar(2) + "HIRGIHHfieldType" + Convert.ToChar(2) + "HKIIIISAnumTeams" + Convert.ToChar(2) + "HJJIII" + "PA" + "gameLengthChoice" + Convert.ToChar(2) + "HJIIIIK" + "name" + Convert.ToChar(2) + "IJ" + Convert.ToChar(2) + "H" + "secondsUntilStart" + Convert.ToChar(2) + "HIRBIHH"); } else sendData("Cl" + "K"); // Error [3] = Skillevel not valid in this lobby } } internal void ProcessPacket_c() // Gamelobby - process new created game { if (Room != null && roomUser != null && Room.Lobby != null && gamePlayer == null) { if (Room.Lobby.validGamerank(roomUser.gamePoints)) { try { int mapID = -1; int teamAmount = -1; int[] Powerups = null; string Name = ""; #region Game settings decoding int keyAmount = Encoding.decodeVL64(currentPacket.Substring(2)); currentPacket = currentPacket.Substring(Encoding.encodeVL64(keyAmount).Length + 2); for (int i = 0; i < keyAmount; i++) { int j = Encoding.decodeB64(currentPacket.Substring(0, 2)); string Key = currentPacket.Substring(2, j); if (currentPacket.Substring(j + 2, 1) == "H") // VL64 value { int Value = Encoding.decodeVL64(currentPacket.Substring(j + 3)); switch (Key) { case "fieldType": mapID = Value; break; case "numTeams": teamAmount = Value; break; } int k = Encoding.encodeVL64(Value).Length; currentPacket = currentPacket.Substring(j + k + 3); } else // B64 value { int valLen = Encoding.decodeB64(currentPacket.Substring(j + 3, 2)); string Value = currentPacket.Substring(j + 5, valLen); switch (Key) { case "allowedPowerups": string[] ps = Value.Split(','); Powerups = new int[ps.Length]; for (int p = 0; p < ps.Length; p++) { int P = int.Parse(ps[p]); if (Room.Lobby.allowsPowerup(P)) Powerups[p] = P; else // Powerup not allowed in this lobby return; } break; case "name": Name = stringManager.filterSwearwords(Value); break; } currentPacket = currentPacket.Substring(j + valLen + 5); } } #endregion if (mapID == -1 || teamAmount == -1 || Name == "") // Incorrect keys supplied by client return; this.gamePlayer = new gamePlayer(this, roomUser.roomUID, null); Room.Lobby.createGame(this.gamePlayer, Name, mapID, teamAmount, Powerups); } catch { } } else sendData("Cl" + "K"); // Error [3] = Skillevel not valid in this lobby } } internal void ProcessPacket_e() // Gamelobby - switch team in game { if (Room != null && Room.Lobby != null && gamePlayer != null && gamePlayer.Game.State == Game.gameState.Waiting) { if (Room.Lobby.validGamerank(roomUser.gamePoints)) { int j = Encoding.decodeVL64(currentPacket.Substring(2)); int teamID = Encoding.decodeVL64(currentPacket.Substring(Encoding.encodeVL64(j).Length + 2)); if (teamID != gamePlayer.teamID && gamePlayer.Game.teamHasSpace(teamID)) { if (gamePlayer.teamID == -1) // User was a subviewer gamePlayer.Game.Subviewers.Remove(gamePlayer); gamePlayer.Game.movePlayer(gamePlayer, gamePlayer.teamID, teamID); } else sendData("Cl" + "H"); // Error [0] = Team full } else sendData("Cl" + "K"); // Error [3] = Skillevel not valid in this lobby } } internal void ProcessPacket_g() // Gamelobby - leave single game sub { leaveGame(); } internal void ProcessPacket_h() // Gamelobby - kick player from game { if (Room != null && Room.Lobby != null && gamePlayer != null && gamePlayer.Game != null && gamePlayer == gamePlayer.Game.Owner) { int roomUID = Encoding.decodeVL64(currentPacket.Substring(2)); for (int i = 0; i < gamePlayer.Game.Teams.Length; i++) { foreach (gamePlayer Member in gamePlayer.Game.Teams[i]) { if (Member.roomUID == roomUID) { Member.sendData("Cl" + "RA"); // Error [6] = kicked from game gamePlayer.Game.movePlayer(Member, i, -1); return; } } } } } internal void ProcessPacket_j() // Gamelobby - start game { if (Room != null && Room.Lobby != null && gamePlayer != null && gamePlayer == gamePlayer.Game.Owner) { gamePlayer.Game.startGame(); } } internal void ProcessPacket_k() // Game - ingame - move unit { if (gamePlayer != null && gamePlayer.Game.State == Game.gameState.Started && gamePlayer.teamID != -1) { gamePlayer.goalX = Encoding.decodeVL64(currentPacket.Substring(3)); gamePlayer.goalY = Encoding.decodeVL64(currentPacket.Substring(Encoding.encodeVL64(gamePlayer.goalX).Length + 3)); } } internal void ProcessPacket_l() // Game - ingame - proceed with restart of game { if (gamePlayer != null && gamePlayer.Game.State == Game.gameState.Ended && gamePlayer.teamID != -1) { gamePlayer.Game.sendData("BK" + "" + _Username + " wants to replay!" + Convert.ToChar(2)); } } internal void ProcessPacket_V() // Game - Intialize Games { } internal void ProcessPacketDn() // Game - Intialize Games { sendData("FY" + "QA1Bouncing Ball level 1III2Bouncing Ball level 2IJI3Bouncing Ball level 3IKI4Bouncing Ball level 4IPAI5Bouncing Ball level 5IQAHFYQA1Bouncing Ball level 1III2Bouncing Ball level 2IJI3Bouncing Ball level 3IKI4Bouncing Ball level 4IPAI5Bouncing Ball level 5IQAH"); } internal void ProcessPacketDc() { sendData("DcFG"); } internal void ProcessPacketDa() { // The user joined/created an existing game if (Room != null && roomUser != null) statusManager.addStatus("joingame", "3 1/"); } internal void ProcessPacketDl() { // Do not create a game, unknow data to be sent sendData("FI" + "RA"); } internal void ProcessPacketDw() { sendData("DwFL"); } internal void ProcessPacketDr() { // unknow data to be sent sendData("Br" + "Da"); } internal void ProcessPacketDu() { // unknown data to be sent sendData("FL" + "PBH"); } internal void ProcessPacketDv() { //unknown data to be sent sendData("DvBK" + "Dv"); } internal void ProcessPacketDx() { // unknown data to be sent sendData("DxQA"); } #endregion #region Moodlight internal void ProcessPacketEW() // Turn moodlight on/off { if (_isOwner == false && _hasRights == false) return; roomManager.moodlight.setSettings(_roomID, false, 0, 0, null, 0); return; } internal void ProcessPacketEU() // Load moodlight settings { if (_isOwner == false && _hasRights == false) return; string settingData = roomManager.moodlight.getSettings(_roomID); if (settingData != null) sendData("Em" + settingData); return; } internal void ProcessPacketEV() // Apply modified moodlight settings { if (_isOwner == false && _hasRights == false) return; int presetID = Encoding.decodeVL64(currentPacket.Substring(2, 1)); int bgState = Encoding.decodeVL64(currentPacket.Substring(3, 1)); string presetColour = currentPacket.Substring(6, Encoding.decodeB64(currentPacket.Substring(4, 2))); int presetDarkF = Encoding.decodeVL64(currentPacket.Substring(presetColour.Length + 6)); if (presetDarkF > 255) presetDarkF = 255; if (presetDarkF < 155) presetDarkF = 85; if (presetID < 1 | presetID > 3) return; if (bgState > 2 | bgState < 1) return; if (presetColour != "#000000" && presetColour != "#82F349" && presetColour != "#F2F851" && presetColour != "#EA4532" && presetColour != "#E759DE" && presetColour != "#0053F7" && presetColour != "#74F5F5") return; roomManager.moodlight.setSettings(_roomID, true, presetID, bgState, presetColour, presetDarkF); return; } #endregion #region lido internal void ProcessPacketAj() // Dive Packet { if (Room == null) return; if (roomUser.Diving == false) return; string DivePacket = currentPacket.Substring(2); Room.sendData("AJ" + roomUser.roomUID + Convert.ToChar(13) + DivePacket); } internal void ProcessPacketAk() // Splash { if (Room == null) return; if (roomUser.Diving == false) return; Room.DiveDoorOpen = true; roomUser.walkLock = false; string[] Cords = currentPacket.Substring(2).Split(",".ToCharArray()); Room.sendData("AGBIGSPLASH position " + Cords[0] + "," + Cords[1]); Room.sendData("AGdoor open"); Room.sendSpecialCast("cam1", "targetcamera " + roomUser.roomUID); Room.sqUNIT[roomUser.X, roomUser.Y] = false; Room.sqUNIT[26, 3] = false; Room.sqUNIT[26, 4] = false; roomUser.X = int.Parse(Cords[0]); roomUser.Y = int.Parse(Cords[1]); roomUser.Diving = false; roomUser.InQueue = false; roomUser.H = Room.sqFLOORHEIGHT[int.Parse(Cords[0]), int.Parse(Cords[1])]; if (roomUser.H <= 7)//zwem error? statusManager.addStatus("swim", ""); roomUser.goalX = 20; roomUser.goalY = 19; } #endregion #region Camera internal void ProcessPacketAW() { int filmAmount = 20; sendData("@D" + Encoding.encodeVL64(filmAmount)); } #endregion #region Effects internal void ProcessPacketEu() { int effectID = Encoding.decodeVL64(currentPacket.Substring(2)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.getInt("SELECT effect_timemax FROM users_effects WHERE userid = '" + this.userID + "' AND effect_id = '" + effectID + "' AND effect_activated = '0' LIMIT 1") < 1) return; if (dbClient.getInt("SELECT effect_timemax FROM users_effects WHERE userid = '" + this.userID + "' AND effect_id = '" + effectID + "' AND effect_activated = '1' LIMIT 1") > 0) return; dbClient.runQuery("UPDATE users_effects SET effect_activated = '1' WHERE userid = '" + this.userID + "' AND effect_id = " + effectID + " LIMIT 1"); sendData("GN" + Encoding.encodeVL64(effectID) + Encoding.encodeVL64(dbClient.getInt("SELECT effect_timemax FROM users_effects WHERE userid = '" + userID + "' AND effect_id = '" + effectID + "' AND effect_activated = '1' LIMIT 1"))); } } internal void ProcessPacketEv() { _activateBuy = true; Handler.ProcessPacket("Ad" + currentPacket.Substring(2) + "@@H"); } internal void ProcessPacketEt() { int effectID = Encoding.decodeVL64(currentPacket.Substring(2)); if (Room != null && roomUser != null) { statusID = "Ge"; statusCount = effectID; Room.sendData(statusID + Encoding.encodeVL64(roomUser.roomUID) + Encoding.encodeVL64(statusCount)); return; } } #endregion #region Pets internal void ProcessPacketAGj() // Pet buying - Check if the name is valid { if (currentPacket.Contains("¬") || currentPacket.Contains(Convert.ToChar(1).ToString()) || currentPacket.Contains(Convert.ToChar(2).ToString())) sendData("@dI"); // Name is invalid else { sendData("@dH"); // Name is valid } } internal void ProcessPacketBAG() // Pet - Show info about the pet { } #endregion #region Rollers just Packets //[14-7-2009 15:48:52 from 62.50.35.171:30000] //@bIHPBJ0.0HH/flatctrl useradmin// //[14-7-2009 15:48:52 from 62.50.35.171:30000] //@bIHPBK0.0HH/flatctrl useradmin/mv 8,2,0.0// //[14-7-2009 15:48:49 from 62.50.35.171:30000] //@bIHPBK0.0PAPA/flatctrl useradmin// //[14-7-2009 15:48:48 from 62.50.35.171:30000] //@bIHPBJ0.0PAPA/flatctrl useradmin/mv 8,3,0.0// //rollers //[14-7-2009 15:46:56 from 62.50.35.171:30000] //@bIHRBJ0.45II/flatctrl useradmin// //[14-7-2009 15:46:56 from 62.50.35.171:30000] //@bIHRBJ0.45II/flatctrl useradmin/// #endregion #region Infobus internal void ProcessPacketAp() { switch (currentPacket.Substring(2)) { 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; } } } internal void ProcessPacketAq() { if (Config.InfobusOpen) { roomUser.goalX = 28; roomUser.goalY = 4; } else sendData("BK" + "Sorry, the infobus isn't open yet." + Convert.ToChar(2)); } internal void ProcessPacketAo() { if (currentPacket.Substring(2, 1) == "0") { roomUser.goalX = 10; roomUser.goalY = 3; } } #endregion #region Room Poll internal void ProcessPacketCj()// start poll - CjZNB [Cj]header [ZNB]poll id { } internal void ProcessPacketCl()// answer question - ClZNBZ_KKIJK -[Cl]header [ZNB]poll id [Z_]question id [K]answer id [K]number of choices submitted [IJK]choices { if (Room == null || roomUser == null) return; int subStringSkip = 2; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { int pollID = Encoding.decodeVL64(currentPacket.Substring(subStringSkip)); if (dbClient.findsResult("SELECT aid FROM poll_results WHERE uid = '" + userID + "' AND pid = '" + pollID + "'")) return; subStringSkip += Encoding.encodeVL64(pollID).Length; int questionID = Encoding.decodeVL64(currentPacket.Substring(subStringSkip)); subStringSkip += Encoding.encodeVL64(questionID).Length; bool typeThree = dbClient.findsResult("SELECT type FROM poll_questions WHERE qid = '" + questionID + "' AND type = '3'"); if (typeThree) { int countAnswers = Encoding.decodeB64(currentPacket.Substring(subStringSkip, 2)); subStringSkip += 2; string Answer = dbClient.getString(currentPacket.Substring(subStringSkip, countAnswers)); dbClient.getString("INSERT INTO poll_results (pid,qid,aid,answers,uid) VALUES ('" + pollID + "','" + questionID + "','0','" + Answer + "','" + userID + "')"); } else { int countAnswers = Encoding.decodeVL64(currentPacket.Substring(subStringSkip)); subStringSkip += Encoding.encodeVL64(countAnswers).Length; int[] Answer = new int[countAnswers]; for (int i = 0; i < countAnswers; i++) { Answer[i] = Encoding.decodeVL64(currentPacket.Substring(subStringSkip)); subStringSkip += Encoding.encodeVL64(Answer[i]).Length; } foreach (int a in Answer) { dbClient.getString("INSERT INTO poll_results (pid,qid,aid,answers,uid) VALUES ('" + pollID + "','" + questionID + "','" + a + "',' ','" + userID + "')"); } } } } #endregion #endregion #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) { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT figure,sex,mission FROM users WHERE id = '" + userID + "'"); } _Figure = Convert.ToString(dRow["figure"]); _Sex = Convert.ToChar(dRow["sex"]); _Mission = Convert.ToString(dRow["mission"]); } if (refreshSettings) sendData("@E" + _ConnectionManager.ConnectionID + Convert.ToChar(2) + _Username + Convert.ToChar(2) + _Figure + Convert.ToChar(2) + _Sex + Convert.ToChar(2) + _Mission + Convert.ToChar(2) + Convert.ToChar(2) + "PCch=s02/53,51,44" + Convert.ToChar(2) + "HI"); if (refreshRoom && Room != null && roomUser != null) Room.sendData("DJ" + Encoding.encodeVL64(roomUser.roomUID) + _Figure + Convert.ToChar(2) + _Sex + Convert.ToChar(2) + _Mission + Convert.ToChar(2)); } /// /// 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) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { _Credits = dbClient.getInt("SELECT credits FROM users WHERE id = '" + userID + "' LIMIT 1"); _Pixels = dbClient.getInt("SELECT pixels FROM users WHERE id = '" + userID + "' LIMIT 1"); } sendData("@F" + _Credits); sendData("Fv" + Encoding.encodeVL64(_Pixels) + "I"); } /// /// Refreshes the users Club subscription status. /// internal void refreshClub() { int restingDays = 0; int passedMonths = 0; int restingMonths = 0; DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT months_expired,months_left,date_monthstarted FROM users_club WHERE userid = '" + userID + "' LIMIT 1"); } if (dRow.Table.Columns.Count > 0) { passedMonths = Convert.ToInt32(dRow["months_expired"]); restingMonths = Convert.ToInt32(dRow["months_left"]) - 1; restingDays = (int)(DateTime.Parse(Convert.ToString(dRow["date_monthstarted"]), new System.Globalization.CultureInfo("en-GB"))).Subtract(DateTime.Now).TotalDays + 31; _clubMember = true; } sendData("@Gclub_habbo" + Convert.ToChar(2) + Encoding.encodeVL64(restingDays) + Encoding.encodeVL64(passedMonths) + Encoding.encodeVL64(restingMonths) + "I"); } /// /// Refreshes the user's badges. /// internal void refreshBadges() { _Badges.Clear(); // Clear old badges _badgeSlotIDs.Clear(); // Clear old badge IDs DataColumn col1; DataColumn col2; DataColumn col3; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { col1 = dbClient.getColumn("SELECT badgeid FROM users_badges WHERE userid = '" + userID + "' ORDER BY slotid ASC"); col2 = dbClient.getColumn("SELECT slotid FROM users_badges WHERE userid = '" + userID + "' ORDER BY slotid ASC"); col3 = dbClient.getColumn("SELECT badgecode FROM system_archievements ORDER BY indexid ASC"); } string[] myBadges = dataHandling.dColToArray(col1); string[] myBadgeSlotIDs = dataHandling.dColToArray(col2); string[] sysArchievements = dataHandling.dColToArray(col3); StringBuilder sbMessage = new StringBuilder(); StringBuilder listArchievements = new StringBuilder(); int badgeCount = 0; for (int i = 0; i < myBadges.Length; i++) { if (myBadges[i].Length > 2) { if (Convert.ToInt32(myBadgeSlotIDs[i]) > 0) // Badge is in a slot! { _badgeSlotIDs.Add(Convert.ToInt32(myBadgeSlotIDs[i])); } else { // Badge is in no slot! _badgeSlotIDs.Add(0); } badgeCount++; _Badges.Add(myBadges[i]); sbMessage.Append(myBadges[i] + Convert.ToChar(2)); } } sendData("Ce" + Encoding.encodeVL64(badgeCount) + sbMessage.ToString() + "H"); for (int i = 0; i < sysArchievements.Length; i++) { listArchievements.Append(Encoding.encodeVL64(i) + "I" + sysArchievements[i] + 1); } sendData("Ft" + "SHJIACH_Graduate1" + Convert.ToChar(2) + "PAIACH_Login1" + Convert.ToChar(2) + "PAJACH_Login2" + Convert.ToChar(2) + "PAKACH_Login3" + Convert.ToChar(2) + "PAPAACH_Login4" + Convert.ToChar(2) + "PAQAACH_Login5" + Convert.ToChar(2) + "PBIACH_RoomEntry1" + Convert.ToChar(2) + "PBJACH_RoomEntry2" + Convert.ToChar(2) + "PBKACH_RoomEntry3" + Convert.ToChar(2) + "SBRAACH_RegistrationDuration6" + Convert.ToChar(2) + "SBSAACH_RegistrationDuration7" + Convert.ToChar(2) + "SBPBACH_RegistrationDuration8" + Convert.ToChar(2) + "SBQBACH_RegistrationDuration9" + Convert.ToChar(2) + "SBRBACH_RegistrationDuration10" + Convert.ToChar(2) + "RAIACH_AvatarLooks1" + Convert.ToChar(2) + "IJGLB" + Convert.ToChar(2) + "IKGLC" + Convert.ToChar(2) + "IPAGLD" + Convert.ToChar(2) + "IQAGLE" + Convert.ToChar(2) + "IRAGLF" + Convert.ToChar(2) + "ISAGLG" + Convert.ToChar(2) + "IPBGLH" + Convert.ToChar(2) + "IQBGLI" + Convert.ToChar(2) + "IRBGLJ" + Convert.ToChar(2) + "SAIACH_Student1" + Convert.ToChar(2) + "PCIHC1" + Convert.ToChar(2) + "PCJHC2" + Convert.ToChar(2) + "PCKHC3" + Convert.ToChar(2) + "PCPAHC4" + Convert.ToChar(2) + "PCQAHC5" + Convert.ToChar(2) + "QAIACH_GamePlayed1" + Convert.ToChar(2) + "QAJACH_GamePlayed2" + Convert.ToChar(2) + "QAKACH_GamePlayed3" + Convert.ToChar(2) + "QAPAACH_GamePlayed4" + Convert.ToChar(2) + "QAQAACH_GamePlayed5" + Convert.ToChar(2)); sendData("Dt" + "IH" + Convert.ToChar(1) + "FCH"); } internal void refreshEffect() { DataColumn dCol; int EffectsCount = 0; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dCol = dbClient.getColumn("SELECT effect_id FROM users_effects WHERE userid = '" + userID + "'"); } string[] Effects = dataHandling.dColToArray(dCol); StringBuilder Effectlist = new StringBuilder(); if (Effects.Length > 0) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { int EffectCount = dbClient.getInt("SELECT COUNT(*) FROM users_effects WHERE userid = '" + userID + "'"); for (int i = EffectCount; i < 27; i++) { int effectID = dbClient.getInt("SELECT effect_id FROM users_effects WHERE userid = '" + userID + "' AND effect_id = " + i + " LIMIT 1"); if (effectID != 0) { int effectStatus = dbClient.getInt("SELECT effect_id FROM users_effects WHERE userid = '" + userID + "' AND effect_id = " + i + " AND effect_activated = 1 LIMIT 1"); int effectTime = dbClient.getInt("SELECT effect_timemax FROM users_effects WHERE userid = '" + userID + "' AND effect_id = " + i + " ORDER BY effect_timemax DESC LIMIT 1"); int effectLeft = dbClient.getInt("SELECT effect_timeleft FROM users_effects WHERE userid = '" + userID + "' AND effect_id = " + i + " ORDER BY effect_timeleft DESC LIMIT 1"); DataRow effectCount = dbClient.getRow("SELECT effect_id FROM users_effects WHERE userid = '" + userID + "' AND effect_id = " + i); EffectsCount++; if (effectStatus == i) Effectlist.Append(Encoding.encodeVL64(i) + Encoding.encodeVL64(effectTime) + Encoding.encodeVL64(effectCount.Table.Rows.Count) + "M"); else Effectlist.Append(Encoding.encodeVL64(i) + Encoding.encodeVL64(effectTime) + Encoding.encodeVL64(effectCount.Table.Rows.Count - 1) + Encoding.encodeVL64(effectLeft)); } } } } sendData("GL" + Encoding.encodeVL64(EffectsCount) + Effectlist); } /// /// Refreshes the user's group status. /// internal void refreshGroupStatus() { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { _groupID = dbClient.getInt("SELECT groupid FROM groups_memberships WHERE userid = '" + userID + "' AND is_current = '1'"); } if (_groupID > 0) // User is member of a group { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { _groupMemberRank = dbClient.getInt("SELECT member_rank FROM groups_memberships WHERE userid = '" + userID + "' AND groupID = '" + _groupID + "'"); } } } /// /// Refreshes the Hand, which contains virtual items, with a specified mode. /// /// The refresh mode, available: 'next', 'prev', 'update', 'last' and 'new'. internal void refreshHand(string Mode) { if (Room == null || roomUser == null) return; DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT furniture.id,furniture.tid,furniture.var FROM users, furniture WHERE furniture.ownerid = users.id AND furniture.ownerid = '" + userID + "' AND furniture.roomid = '0' ORDER BY pickedup ASC"); } StringBuilder Hand = new StringBuilder(""); int startID = 0; int stopID = dTable.Rows.Count; int useVar = 0; switch (Mode) { // Last case "H": case "last": _handPage = (stopID - 1) / 9; break; // Next case "I": case "next": _handPage++; break; // Prevous case "J": case "prev": _handPage--; break; // Update case "PA": case "update": break; // Default default: _handPage = 0; break; } try { if (stopID > 0) { reCount: startID = _handPage * 9; if (stopID > (startID + 9)) { stopID = startID + 9; } if (startID > stopID || startID == stopID) { _handPage--; goto reCount; } DataRow dRow; for (int f = startID; f < stopID; f++) { dRow = dTable.Rows[f]; catalogueManager.itemTemplate Template = catalogueManager.getTemplate(Convert.ToInt32(dRow["tid"])); int Recycleable = 1; if (Template.isRecycleable == false) Recycleable = 0; if (Template.typeID == 0) // Wallitem { if (Template.Sprite == "poster") { useVar = int.Parse(Template.Colour); } else { useVar = 0; } if (Template.Sprite == "post.it" || Template.Sprite == "post.it.vd") // Stickies - pad size useVar = Convert.ToInt32(dRow["var"]); Hand.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + Encoding.encodeVL64(f) + "I" + Convert.ToChar(2).ToString() + Encoding.encodeVL64(int.Parse(Convert.ToString(dRow["id"]))) + Encoding.encodeVL64(Template.indexID) + Convert.ToChar(2).ToString() + Encoding.encodeVL64(Recycleable) + Encoding.encodeVL64(Recycleable) + "MK"); } // WallItems else { // Flooritems Hand.Append(Encoding.encodeVL64(Convert.ToInt32(dRow["id"])) + Encoding.encodeVL64(f) + "S" + Convert.ToChar(2).ToString() + Encoding.encodeVL64(int.Parse(Convert.ToString(dRow["id"]))) + Encoding.encodeVL64(Template.indexID) + Convert.ToChar(2) + Convert.ToChar(2) + useVar + Convert.ToChar(2).ToString() + Encoding.encodeVL64(Recycleable) + Encoding.encodeVL64(Recycleable) + Convert.ToChar(2).ToString() + "M"); } } } Hand.Append(Encoding.encodeVL64(dTable.Rows.Count)); sendData("BL" + Encoding.encodeVL64(stopID - startID) + Hand.ToString() + Convert.ToChar(1) + "C[" + Room.Heightmap); } catch { sendData("BL" + "HH" + Convert.ToChar(1) + "C[" + Room.Heightmap); } } /// /// Refreshes the trade window for the user. /// internal void refreshTradeBoxes() { if (Room != null && Room.containsUser(_tradePartnerRoomUID) && roomUser != null) { this._tradeAccept = false; virtualUser Partner = Room.getUser(_tradePartnerRoomUID); StringBuilder tradeBoxes = new StringBuilder("Al" + Encoding.encodeVL64(this.roomUser.userID)); if (_tradeItemCount > 0) { tradeBoxes.Append(catalogueManager.tradeItemList(_tradeItems)); } else { tradeBoxes.Append("H"); } tradeBoxes.Append(Encoding.encodeVL64(Partner.roomUser.userID)); if (Partner._tradeItemCount > 0) { tradeBoxes.Append(catalogueManager.tradeItemList(Partner._tradeItems)); } else { tradeBoxes.Append("H"); } sendData(tradeBoxes.ToString()); } } /// /// Aborts the trade between this user and his/her partner. /// internal void abortTrade() { if (Room != null && Room.containsUser(_tradePartnerRoomUID) && roomUser != null) { virtualUser Partner = Room.getUser(_tradePartnerRoomUID); this.sendData("An"); this.refreshHand("update"); Partner.sendData("An"); Partner.refreshHand("update"); this._tradePartnerRoomUID = -1; this._tradeAccept = false; this._tradeItems = new int[65]; this._tradeItemCount = 0; this.statusManager.removeStatus("trd"); this.roomUser.Refresh(); Partner._tradePartnerRoomUID = -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 Public commands #region Rooms #region :sellproperty & :buyproperty case "sellproperty": { string owner; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { owner = dbClient.getString("SELECT owner FROM rooms WHERE id = '" + _roomID + "'"); } if (owner != _Username) sendData("BK" + "Sorry, but you cannot sell someone elses property." + Convert.ToChar(2)); else { int salepice = int.Parse(args[1]); if (salepice < 0) sendData("BK" + "Sorry, but you cannot sell your property for less then 0 credits." + Convert.ToChar(2)); else { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE rooms SET price = '" + salepice + "', sale = '1' WHERE id = '" + _roomID + "'"); } sendData("BK" + "You have successfully put your property on the market for " + salepice + " credits!" + Convert.ToChar(2)); } } break; } case "buyproperty": { string forsale; string roomprice; string owner; string credits; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { forsale = dbClient.getString("SELECT sale FROM rooms WHERE id = '" + _roomID + "'"); roomprice = dbClient.getString("SELECT price FROM rooms WHERE id = '" + _roomID + "'"); owner = dbClient.getString("SELECT owner FROM rooms WHERE id = '" + _roomID + "'"); credits = dbClient.getString("SELECT credits FROM users WHERE name = '" + _Username + "'"); } if (forsale != "1") sendData("BK" + "Sorry, but this room is not for sale." + Convert.ToChar(2)); else { int roomprice_mod = int.Parse(roomprice); int credits_mod = int.Parse(credits); if (roomprice_mod > credits_mod && owner != _Username) sendData("BK" + "Sorry, but you do not have enough credits to purchase this property." + Convert.ToChar(2)); else { virtualUser User = userManager.getUser(owner); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE rooms SET owner = '" + _Username + "', sale = '0' WHERE id = '" + _roomID + "'"); dbClient.runQuery("UPDATE users SET credits = credits + '" + roomprice + "' WHERE name = '" + owner + "'"); dbClient.runQuery("UPDATE users SET credits = credits - '" + roomprice + "' WHERE name = '" + _Username + "'"); dbClient.runQuery("DELETE FROM jobs_rooms WHERE room_id = '" + _roomID + "';"); } refreshValueables(true, false); User.refreshValueables(true, false); sendData("D^" + "H" + Encoding.encodeVL64(_roomID)); sendData("BK" + "You have successfully bought this property for " + roomprice + " credits." + Convert.ToChar(2)); User.sendData("BK" + _Username + " has bought your room for " + roomprice + " credits!" + Convert.ToChar(2)); } } break; } #endregion #region :roomdetails case "roomdetails": case "roomid": { sendData("BK" + "Room ID: " + _roomID + Convert.ToChar(2)); break; } #endregion #endregion #region Timers #region :jailtimer case "jailtimer": { int ifarrested; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { ifarrested = dbClient.getInt("SELECT arrested FROM users WHERE name = '" + _Username + "'"); } if (ifarrested == 1 && jailLooper == null) { ThreadStart jailStarter = new ThreadStart(jailTime); jailLooper = new Thread(jailStarter); jailLooper.Priority = ThreadPriority.Lowest; jailLooper.Start(); } break; } #endregion #region :deadtimer case "deadtimer": { int ifdead; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { ifdead = dbClient.getInt("SELECT dead FROM users WHERE name = '" + _Username + "'"); } if (ifdead == 1 && deadLooper == null) { ThreadStart koStarter = new ThreadStart(knockOut); deadLooper = new Thread(koStarter); deadLooper.Priority = ThreadPriority.Lowest; deadLooper.Start(); } break; } #endregion #region :jailbreak case "jailbreak": { if (jailBreakLooper == null && _roomID == 322 && roomUser.Y == 10 && roomUser.X == 9) { userManager.sendToCop(1, true, "BK" + "Hurry, there is a jailbreak in progress!" + Convert.ToChar(2)); Room.sendSaying(roomUser, "*starts knocking down the jail wall*"); Room.sendSaying(roomUser, "*needs four more minutes to succesfully knock down this wall*"); ThreadStart jailBreakStarter = new ThreadStart(jailBreak); jailBreakLooper = new Thread(jailBreakStarter); jailBreakLooper.Priority = ThreadPriority.Lowest; jailBreakLooper.Start(); } break; } #endregion #region :workout case "workout": { int ifWorkingOut; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { ifWorkingOut = dbClient.getInt("SELECT working_out FROM users WHERE name = '" + _Username + "'"); } if (ifWorkingOut == 0 && workoutDosLooper == null && workoutLooper == null) { if (_roomID == 341) { if ((roomUser.Y == 7 && roomUser.X == 5) || (roomUser.Y == 7 && roomUser.X == 7) || (roomUser.Y == 7 && roomUser.X == 9) || (roomUser.Y == 10 && roomUser.X == 5) || (roomUser.Y == 10 && roomUser.X == 7) || (roomUser.Y == 10 && roomUser.X == 9) || (roomUser.Y == 13 && roomUser.X == 5) || (roomUser.Y == 13 && roomUser.X == 7) || (roomUser.Y == 13 && roomUser.X == 9)) { if (_Rank < 2) { sendData("Sorry, but this a VIP only gym." + Convert.ToChar(2)); } else { Room.sendSaying(roomUser, "*starts to workout*"); ThreadStart workoutStarter = new ThreadStart(workOut); workoutLooper = new Thread(workoutStarter); workoutLooper.Priority = ThreadPriority.Lowest; workoutLooper.Start(); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET working_out = '1' WHERE name = '" + _Username + "'"); } } } } if (_roomID == 117) { if ((roomUser.Y == 6 && roomUser.X == 5) || (roomUser.Y == 6 && roomUser.X == 7) || (roomUser.Y == 6 && roomUser.X == 9) || (roomUser.Y == 9 && roomUser.X == 5) || (roomUser.Y == 9 && roomUser.X == 7) || (roomUser.Y == 9 && roomUser.X == 9) || (roomUser.Y == 12 && roomUser.X == 5) || (roomUser.Y == 12 && roomUser.X == 7) || (roomUser.Y == 12 && roomUser.X == 9)) { Room.sendSaying(roomUser, "*starts to workout*"); ThreadStart workoutDosStarter = new ThreadStart(workOutDos); workoutDosLooper = new Thread(workoutDosStarter); workoutDosLooper.Priority = ThreadPriority.Lowest; workoutDosLooper.Start(); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET working_out = '1' WHERE name = '" + _Username + "'"); } } } } break; } #endregion #endregion #region General Commands #region :poof case "poof": // Use the poof animation in room { refreshAppearance(false, false, true); break; } #endregion #region :commandlist case "commands": // Display information about the emulator { if (_Rank < 4) { sendData("BK" + "About: \r" + "Server Time: " + DateTime.Now.ToString() + " (EST)\r\r" + "\r" + "Emulator: Life R35 Emulator\r" + "\r" + "Your user commands: \r" + "\r" + "Hotel user commands \r" + ":about/:details \r" + ":cleanhand \r" + ":no_height_limits \r" + ":stack_rugs \r" + "afk/back \r" + ":whosonline \r" + ":server \r" + ":staff \r" + ":friend_request \r" + ":roomid \r" + "stats \r" + "pickup \r" + "pull \r" + "sleep \r" + "balance \r" + "deposit \r" + "taxi \r" + "textmsg \r" + "creditcheck \r" + "give \r" + "\r" + Convert.ToChar(2)); } else { sendData("BK" + "Moderator Commands \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" + "DCR Support: R35-R36" + Convert.ToChar(2)); } break; } #endregion #region :cleanhand case "cleanhand": // Deletes everything from the senders hand { if (_clean == true) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM furniture WHERE ownerid = '" + userID + "' AND roomid = '0'"); } refreshHand("update"); _clean = false; } else { sendData("BKIf you want to clear your whole hand please type the command again," + Convert.ToChar(13) + "this command will remove every item from your inventory." + Convert.ToChar(13) + Convert.ToChar(13) + "WARNING: You are unable to restore or cancel the process!" + Convert.ToChar(2)); _clean = true; } break; } #endregion #region :no_height_limits case "no_height_limits": // Allows or denys the user to walk in the height without any limits { if (_noHeightLimit == false) { _noHeightLimit = true; sendData("BKThe height limit has been disabled for you! You can now walk in the height without any limits." + Convert.ToChar(2)); } else { _noHeightLimit = false; sendData("BKThe height limit has been enabled for you! You can not walk in the height without any limits anymore." + Convert.ToChar(2)); } break; } #endregion #region afk/back case "afk": // Shows the noobusers has brb in the room { if (brbLooper == null) { ThreadStart brbStarter = new ThreadStart(showBrb); brbLooper = new Thread(brbStarter); brbLooper.Priority = ThreadPriority.Lowest; brbLooper.Start(); } break; } case "back": // Stops the noobusers from being shown as brb { if (brbLooper != null) { brbLooper.Abort(); brbLooper = null; Room.sendShout(roomUser, "I'm Back"); } break; } #endregion #region :whosonline case "whosonline": // Generates a list of users connected sendData(userManager.generateWhosOnline(rankManager.containsRight(this, "fuse_administrator_access", userID))); break; #endregion #region :server case "server": // Display information about the emulator { sendData("BK" + "Server Information \r" + "Server Time: " + DateTime.Now.ToString() + " (GMT)\r\r" + "\r" + "Emulator: Life Roleplaying Emulator\r" + "Build: 4.4.0.0 (05/16/2010)\r" + "Coded by: Him\r" + "DCR Support: R36" + Convert.ToChar(2)); break; } #endregion #region :staff case "staff": // / How to Contact Hotel Staff { sendData("BK" + "If you need to contact the Hotel Staff Please use the Call for help" + Convert.ToChar(2)); break; } #endregion #region :rooms case "rooms": // commands list { sendData("BK" + "Landing: 1\r" + "Police Station: 320\r" + "Bank: 330\r" + "Gym: 117\r" + "Local Brawl: 221\r" + "Diner: 112\r" + "Hospital: 167\r" + "Mall: 331\r" + "Casino: 804\r"); break; } #endregion #region :flagme case "flagme": { if (_Rank > 2) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET flagged = '1' WHERE name = '" + _Username + "'"); sendData("BK" + "You have been flagged" + Convert.ToChar(2)); } Disconnect(); } break; } #endregion #region :stats case "stats": string health; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { health = dbClient.getString("SELECT health FROM users WHERE name = '" + _Username + "'"); } sendData("BK" + "Health: " + health + Convert.ToChar(2)); break; #endregion #region RP Commands #region :corpdeposit case "corpdeposit": { int myCorp = int.Parse(args[1]); int myCoins = int.Parse(args[2]); int getCorp; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { getCorp = dbClient.getInt("SELECT id FROM jobs_corps WHERE id = '" + myCorp + "'"); } if (getCorp == myCorp) { if (myCoins <= _Credits) { if (myCoins > 0) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET credits = credits - '" + myCoins + "' WHERE name = '" + _Username + "'"); dbClient.runQuery("UPDATE jobs_corps SET corp_balance = corp_balance + '" + myCoins + "' WHERE id = '" + getCorp + "'"); refreshValueables(true, false); } sendData("BK" + "You have successfully deposited " + myCoins + " credits." + Convert.ToChar(2)); } else { sendData("BK" + "You must deposit atleast one or more credits." + Convert.ToChar(2)); } } else { sendData("BK" + "Sorry, but you do not have enough credits on you to make this deposit." + Convert.ToChar(2)); } } else { sendData("BK" + "Sorry, but that business does not work." + Convert.ToChar(2)); } break; } #endregion #region :pickup case "pickup": // picks up all furniture in room { int isOwner; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { isOwner = dbClient.getInt("SELECT id FROM users WHERE id = '" + _isOwner + "'"); } if (_isOwner == true) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) dbClient.runQuery("UPDATE furniture SET roomid = 0 WHERE roomid = '" + Room.roomID + "'"); Room.sendData("DBO" + "\r"); } if (_isOwner == false) // this will quit 50 credits to some user that it isn't the owner of the room { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) dbClient.runQuery("UPDATE users SET credits = credits -50 WHERE id = '" + this.userID + "'"); sendData("BK¿what are you trying? -50 credits for trying to steal furnis" + Convert.ToChar(2)); } } break; #endregion #region :pull case "pull": { if (_Rank > 1) { virtualUser User = userManager.getUser(args[1]); if (User.roomUser != roomUser && (roomUser.X + 2 == User.roomUser.X || roomUser.X - 2 == User.roomUser.X || roomUser.Y + 2 == User.roomUser.Y || roomUser.Y - 2 == User.roomUser.Y)) { switch (roomUser.Z2) { case 0: { User.roomUser.goalX = User.roomUser.X; User.roomUser.goalY = User.roomUser.Y + 1; break; } case 2: { User.roomUser.goalX = User.roomUser.X - 1; User.roomUser.goalY = User.roomUser.Y; break; } case 4: { User.roomUser.goalX = User.roomUser.X; User.roomUser.goalY = User.roomUser.Y - 1; break; } case 6: { User.roomUser.goalX = User.roomUser.X + 1; User.roomUser.goalY = User.roomUser.Y; break; } } Room.sendSaying(roomUser, "*Pulls " + args[1] + "*"); } } break; } #endregion #region :sleep case "sleep": if (this.statusManager.containsStatus("lay")) { this.Room.sendShout(this.roomUser, "Zzzzz Zzzzz"); } break; #endregion #region :balance case "balance": { int getAmount; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { getAmount = dbClient.getInt("SELECT bank_account FROM users WHERE name = '" + _Username + "'"); //dbClient.runQuery("UPDATE users SET credits = '250'"); } sendData("BK" + "Account Balance: " + getAmount + Convert.ToChar(2)); Room.sendSaying(roomUser, "*checks my bank account balance*"); break; } #endregion #region :deposit case "deposit": { if (_roomID != 330) { sendData("BK" + "You must be in the bank to make a deposit." + Convert.ToChar(2)); } else { int getAmount; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { getAmount = dbClient.getInt("SELECT credits FROM users WHERE name = '" + _Username + "'"); } int amountDepo = int.Parse(args[1]); if (getAmount >= amountDepo && amountDepo > 0) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET credits = credits - '" + amountDepo + "' WHERE name = '" + _Username + "'"); dbClient.runQuery("UPDATE users SET bank_account = bank_account + '" + amountDepo + "' WHERE name = '" + _Username + "'"); } Room.sendSaying(roomUser, "*deposits " + amountDepo + " credits into my bank account*"); refreshValueables(true, false); } else { Room.sendSaying(roomUser, "*attempts to deposit " + amountDepo + " credits into my bank account, but notices that I only have " + getAmount + " credits*"); } } break; } #endregion #region :taxi case "taxi": { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (roomUser.walkLock == true) { sendData("BK" + "Nice try, but you are either stunned or cuffed." + Convert.ToChar(2)); } else { int isDead = dbClient.getInt("SELECT dead FROM users WHERE name = '" + _Username + "'"); string taxidata = dbClient.getString("SELECT taxi FROM rooms WHERE id = '" + _roomID + "'"); string taxidata2 = dbClient.getString("SELECT taxi FROM rooms WHERE id = '" + args[1] + "'"); string taxidata3 = dbClient.getString("SELECT name FROM rooms WHERE id = '" + args[1] + "'"); int showname = dbClient.getInt("SELECT showname FROM rooms WHERE id = '" + args[1] + "'"); int isCop = dbClient.getInt("SELECT corp_id FROM users WHERE name = '" + _Username + "'"); int myCredits = dbClient.getInt("SELECT credits FROM users WHERE name = '" + _Username + "'"); if (isDead == 1) { sendData("BK" + "Nice try, but you are still knocked out." + Convert.ToChar(2)); } else { if (taxidata == "1" || taxidata2 == "1" || showname < 1) { sendData("BK" + "There was an issue with your taxi:\r1. You must be outside to use a taxi.\r2. You can only taxi to outide areas.\r3. The room does not exist!" + Convert.ToChar(2)); } else { int roomid = int.Parse(args[1]); if (myCredits < -100) { sendData("BK" + "Sorry, but you do not have enough to pay for the taxi fare.\rYou need -100 credits or more to use a taxi." + Convert.ToChar(2)); } else { Room.sendSaying(roomUser, "*calls a taxi for " + taxidata3 + " [" + args[1] + "]*"); sendData("D^" + "H" + Encoding.encodeVL64(roomid)); if (isCop != 1) { if (_Rank > 1) { dbClient.runQuery("UPDATE users SET credits = credits + '-2' WHERE name = '" + _Username + "'"); sendData("BK" + "You have been charged 2 credits for your taxi fare." + Convert.ToChar(2)); refreshValueables(true, false); } else { dbClient.runQuery("UPDATE users SET credits = credits + '-10' WHERE name = '" + _Username + "'"); sendData("BK" + "You have been charged 10 credits for your taxi fare." + Convert.ToChar(2)); refreshValueables(true, false); } } else { refreshValueables(true, false); sendData("BK" + "You have been charged 0 credits for your taxi fare." + Convert.ToChar(2)); } } } } } } break; } #endregion #region :textmsg case "textmsg": { virtualUser User = userManager.getUser(args[1]); string Message = stringManager.wrapParameters(args, 2); User.sendData("BK" + "Text Message! \r To: " + User._Username + "\r" + "From:" + _Username + "\r" + "Message:" + Message + Convert.ToChar(2)); sendData("BK" + "You have text messaged " + User._Username + " and lost 5 credits." + Convert.ToChar(2)); Room.Refresh(roomUser); refreshAppearance(true, true, true); refreshValueables(true, false); break; } #endregion #region :creditcheck case "creditcheck": // Who has the most credits { virtualUser User = userManager.getUser(args[1]); if (User._Credits >= _Credits) { User.sendData("BK" + "You have been credit checked, sadly" + _Username + " has more than you" + Convert.ToChar(2)); sendData("BK" + "You have more credits than " + User._Username + "!" + Convert.ToChar(2)); } else User.sendData("BK" + "You have been credit checked, sadly" + _Username + " has less than you" + Convert.ToChar(2)); sendData("BK" + "You have less credits than " + User._Username + "!" + Convert.ToChar(2)); break; } #endregion #region :give case "give": { int myCoins; int giveCoins = int.Parse(args[2]); virtualUser User = userManager.getUser(args[1]); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { myCoins = dbClient.getInt("SELECT credits FROM users WHERE name = '" + _Username + "'"); } if (myCoins >= giveCoins && giveCoins > 0) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET credits = credits + '" + giveCoins + "' WHERE name = '" + User._Username + "'"); dbClient.runQuery("UPDATE users SET credits = credits - '" + giveCoins + "' WHERE name = '" + _Username + "'"); Room.sendSaying(roomUser, "*hands " + User._Username + " " + giveCoins + " credits*"); refreshValueables(true, false); User.refreshValueables(true, false); } } break; } #endregion #region :punch case "punch": case "hit": case "swing": { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { virtualUser User = userManager.getUser(args[1]); if (roomUser.walkLock == true) { sendData("BK" + "Nice try, but you are either stunned or cuffed." + Convert.ToChar(2)); } else { if (punchCdLooper != null) { Room.sendWhisper(roomUser, _Username, "*attempts to swing at " + User._Username + ", but is too exhausted*"); } else { int isArrested = dbClient.getInt("SELECT arrested FROM users WHERE name = '" + _Username + "'"); int canHit = dbClient.getInt("SELECT violence FROM rooms WHERE id = '" + _roomID + "'"); int isAfk = dbClient.getInt("SELECT afk FROM users WHERE name = '" + User._Username + "'"); if (isAfk == 1) { sendData("BK" + "Sorry, but this user is AFK." + Convert.ToChar(2)); } else { if (isArrested < 1) { if (canHit == 1) { sendData("BK" + "Sorry, but this room has been declared a no fighting zone." + Convert.ToChar(2)); } else { if (User._roomID == _roomID && (roomUser.Y == User.roomUser.Y && roomUser.X == User.roomUser.X) || (roomUser.Y + 1 == User.roomUser.Y && roomUser.X == User.roomUser.X) || (roomUser.Y - 1 == User.roomUser.Y && roomUser.X == User.roomUser.X) || (roomUser.Y == User.roomUser.Y && roomUser.X + 1 == User.roomUser.X) || (roomUser.Y == User.roomUser.Y && roomUser.X - 1 == User.roomUser.X)) { //db queries int myHealth = dbClient.getInt("SELECT health FROM users WHERE name = '" + User._Username + "'"); int str_mod = dbClient.getInt("SELECT str FROM users WHERE name = '" + _Username + "'"); //generates a random number Random randNum = new Random(); int hit_dif_0 = randNum.Next(1, 3); int hit_dif_1 = randNum.Next(1, 13); //what a user hits int hit = str_mod * hit_dif_0 + hit_dif_1; int getHit = myHealth - hit; if (getHit < 1 && _Username == User._Username) { sendData("BK" + "Sorry, but you can not knock yourself out." + Convert.ToChar(2)); } else { dbClient.runQuery("UPDATE users SET health = health - '" + hit + "' WHERE name = '" + User._Username + "'"); dbClient.runQuery("UPDATE users SET hits = hits + 1 WHERE name = '" + _Username + "'"); int health_db_ko = dbClient.getInt("SELECT health FROM users WHERE name = '" + User._Username + "'"); Room.sendShout(roomUser, "*Swings at " + User._Username + ", causing " + hit + " damage*"); ThreadStart punchCdStarter = new ThreadStart(punchCoolDown); punchCdLooper = new Thread(punchCdStarter); punchCdLooper.Priority = ThreadPriority.Lowest; punchCdLooper.Start(); //if the user has 0 or less helth left if (health_db_ko < 1) { if (User._Mission == "[Game] Deathmatch" || User._Mission == "[Game] Brawl") { Room.sendShout(roomUser, "*Knocks out " + args[1] + ", sending them to the lobby*"); if (User._Mission == "[Game] Deathmatch") { if (_Mission == "[Game] Deathmatch") { dbClient.runQuery("UPDATE users SET game_dm = game_dm + '10' WHERE name = '" + _Username + "'"); } User.sendData("D^" + "H" + Encoding.encodeVL64(1)); User.sendData("BK" + "Thank you for playing deathmatch." + Convert.ToChar(2)); } if (User._Mission == "[Game] Brawl") { if (_Mission == "[Game] Brawl") { dbClient.runQuery("UPDATE users SET game_brawl = game_brawl + '10' WHERE name = '" + _Username + "'"); } User.sendData("D^" + "H" + Encoding.encodeVL64(1)); User.sendData("BK" + "Thank you for playing brawl." + Convert.ToChar(2)); } User.refreshAppearance(true, true, true); dbClient.runQuery("UPDATE users SET health = '100' WHERE name = '" + User._Username + "'"); } else { User.sendData("D^" + "H" + Encoding.encodeVL64(168)); User.sendData("BK" + "You have been knocked out by another user and sent to the hospital." + Convert.ToChar(2)); Room.sendShout(roomUser, "*Knocks out " + args[1] + ", sending them to the hospital*"); dbClient.runQuery("UPDATE users SET kills = kills + 1 WHERE name = '" + _Username + "'"); dbClient.runQuery("UPDATE users SET deaths = deaths + 1, dead = '1', time_dead = '10' WHERE name = '" + User._Username + "'"); User._Mission = "Dead"; refreshAppearance(true, true, true); ThreadStart koStarter = new ThreadStart(User.knockOut); User.deadLooper = new Thread(koStarter); User.deadLooper.Priority = ThreadPriority.Lowest; User.deadLooper.Start(); User.roomUser.walkLock = true; } } } } else { if (User._roomID == _roomID && (roomUser.Y + 1 == User.roomUser.Y && roomUser.X + 1 == User.roomUser.X) || (roomUser.Y - 1 == User.roomUser.Y && roomUser.X - 1 == User.roomUser.X) || (roomUser.Y - 1 == User.roomUser.Y && roomUser.X + 1 == User.roomUser.X) || (roomUser.Y + 1 == User.roomUser.Y && roomUser.X - 1 == User.roomUser.X)) { Room.sendShout(roomUser, "*Swings at " + args[1] + ", but misses*"); } } } } } } } } break; } #endregion #region :911 case "911": { if (copCdLooper != null) { sendData("BK" + "Sorry, but you have to wait to send another 911 call." + Convert.ToChar(2)); } else { int isArrested; int copID; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { isArrested = dbClient.getInt("SELECT arrested FROM users WHERE name = '" + _Username + "'"); copID = dbClient.getInt("SELECT id FROM police_call"); } if (isArrested == 0) { string cfhMessage = Text.Substring(3); Room.sendSaying(roomUser, "*calls the police for help*"); userManager.sendToCop(1, false, "BK" + "Caller: " + _Username + "\rMessage: " + cfhMessage + "\rRoom ID: " + _roomID + Convert.ToChar(2)); ThreadStart copCdStarter = new ThreadStart(copCoolDown); copCdLooper = new Thread(copCdStarter); copCdLooper.Priority = ThreadPriority.Lowest; copCdLooper.Start(); } } break; } #endregion #region :push case "push": { if (pushCdLooper != null) { Room.sendWhisper(roomUser, _Username, "(cooldown)"); } else { virtualUser User = userManager.getUser(args[1]); if (User.roomUser != roomUser && (roomUser.X + 1 == User.roomUser.X || roomUser.X - 1 == User.roomUser.X || roomUser.Y + 1 == User.roomUser.Y || roomUser.Y - 1 == User.roomUser.Y)) { switch (roomUser.Z2) { case 0: { User.roomUser.goalX = User.roomUser.X; User.roomUser.goalY = User.roomUser.Y - 1; break; } case 2: { User.roomUser.goalX = User.roomUser.X + 1; User.roomUser.goalY = User.roomUser.Y; break; } case 4: { User.roomUser.goalX = User.roomUser.X; User.roomUser.goalY = User.roomUser.Y + 1; break; } case 6: { User.roomUser.goalX = User.roomUser.X - 1; User.roomUser.goalY = User.roomUser.Y; break; } } Room.sendSaying(roomUser, "*Pushes " + User._Username + "*"); ThreadStart pushCdStarter = new ThreadStart(pushCoolDown); pushCdLooper = new Thread(pushCdStarter); pushCdLooper.Priority = ThreadPriority.Lowest; pushCdLooper.Start(); } } break; } #endregion #endregion #region Jobs #region Bank #region :withdraw case "withdraw": { int getJob; int isWorking; int getAuth; int getAmount; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { getJob = dbClient.getInt("SELECT secure_id FROM users WHERE name = '" + _Username + "'"); isWorking = dbClient.getInt("SELECT working FROM users WHERE name = '" + _Username + "'"); getAuth = dbClient.getInt("SELECT withdraw FROM jobs_ranks WHERE id = '" + getJob + "'"); getAmount = dbClient.getInt("SELECT bank_account FROM users WHERE name = '" + args[1] + "'"); } if (getAuth < 1) { sendData("BK" + "Sorry, but you do not have the authority to preform this action." + Convert.ToChar(2)); } else { if (isWorking < 1) { sendData("BK" + "You must be working to prefrom this action." + Convert.ToChar(2)); } else { int amountReq = int.Parse(args[2]); if (getAmount < amountReq || amountReq < 0) { Room.sendSaying(roomUser, "*attempts to withdraw " + userID + " " + amountReq + " credits, but notices that they only have " + getAmount + " credits in their bank account*"); } else { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET credits = credits + '" + amountReq + "', bank_account = bank_account - '" + amountReq + "' WHERE name = '" + userID + "'"); Room.sendSaying(roomUser, "*withdraws " + amountReq + " credits from " + args[1] + "'s bank account*"); Room.sendSaying(roomUser, "*hands " + amountReq + " credits over to " + args[1] + "*"); virtualUser User = userManager.getUser(args[1]); User.refreshValueables(true, false); } } } } break; } #endregion #endregion #region Hospital #region :heal case "heal": { if (cdLooper != null) { Room.sendWhisper(roomUser, _Username, "(cooldown)"); } else { if (_roomID == 167 || _roomID == 168) { virtualUser User = userManager.getUser(args[1]); if ((roomUser.Y == User.roomUser.Y && roomUser.X == User.roomUser.X) || (roomUser.Y + 1 == User.roomUser.Y && roomUser.X == User.roomUser.X) || (roomUser.Y - 1 == User.roomUser.Y && roomUser.X == User.roomUser.X) || (roomUser.Y == User.roomUser.Y && roomUser.X + 1 == User.roomUser.X) || (roomUser.Y == User.roomUser.Y && roomUser.X - 1 == User.roomUser.X)) { int getHealth; int canHeal; int getJob; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { getJob = dbClient.getInt("SELECT secure_id FROM users WHERE name = '" + _Username + "'"); canHeal = dbClient.getInt("SELECT heal FROM jobs_ranks WHERE id = '" + getJob + "'"); getHealth = dbClient.getInt("SELECT health FROM users WHERE name = '" + args[1] + "'"); } if (canHeal == 1) { ThreadStart cdStarter = new ThreadStart(coolDown); cdLooper = new Thread(cdStarter); cdLooper.Priority = ThreadPriority.Lowest; cdLooper.Start(); if (getHealth > 50) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET health = '100' WHERE name = '" + args[1] + "'"); Room.sendSaying(roomUser, "*heals " + args[1] + "*"); } } else { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET health = health + 50 WHERE name = '" + args[1] + "'"); } Room.sendSaying(roomUser, "*heals " + args[1] + "*"); } } } } } break; } #endregion #endregion #region Police/Security #region :timeleft case "timeleft": { virtualUser User = userManager.getUser(args[1]); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) if (_roomID == 150) { { int getCorp = dbClient.getInt("SELECT corp_id FROM users WHERE name = '" + _Username + "'"); if (getCorp == 1) { int getTime = dbClient.getInt("SELECT time_jail FROM users WHERE name = '" + User._Username + "'"); Room.sendShout(roomUser, "*looks up how much time " + User._Username + " has left*"); Room.sendShout(roomUser, "*notices that he only has " + getTime + " minutes left*"); } } } break; } #endregion #region :arrest