using System; using System.Data; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.Collections.Generic; using Holo.Managers; using Holo.Virtual.Rooms; using Holo.Virtual.Users.Items; using Holo.Virtual.Users.Messenger; using Holo.Virtual.Rooms.Pets; using Holo.Virtual.Rooms.FantasyBots; using Holo.Virtual; using Holo.Source.Managers; using Holo.Source.GameConnectionSystem; using Holo.Source.Socket_servers.Game_Socketsystem; using Holo.Socketservers; using Holo.Source.Managers.User; using Holo.Virtual.Rooms.Pathfinding; using Microsoft.VisualBasic; using Microsoft.VisualBasic.ApplicationServices; using Ion.Storage; using Sec.cct; 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; private gameConnection _ConnectionManager; private messageHandler Handler; internal bool pingOK; internal bool _isDisconnected; public bool _isLoggedIn; internal int _tradePartnerRoomUID = -1; private bool _receivedSpriteIndex; private int _handPage; internal List _Badges = new List(); internal List _badgeSlotIDs = new List(); private delegate void timedDisconnector(int ms); internal virtualRoom Room; internal virtualRoomUser roomUser; internal virtualRoomUserStatusManager statusManager; internal virtualMessenger Messenger; #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 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 string _mutedIDs; internal int _teleporterID; internal int _teleporterRoomID; internal int _maxFriends; public bool nameChanged = false; internal string rpxid; internal int Changename; internal string rpxType; internal bool _FilterDisabled; internal int _violationsFilter; internal bool isInvisible = false; internal bool isToExit = false; internal DateTime startGame; internal Thread ImBrb; internal ThreadStart sBrb; internal bool frontFurnis = 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 bool RegisteredPackets = false; internal int _updatePixels = Config.UpdatePixels; #endregion #region Constructors/destructors public virtualUser(gameConnection ConnectionManager) { this._ConnectionManager = ConnectionManager; } ~virtualUser() { if (_isDisconnected == false) Disconnect(); GC.Collect(); } #endregion #region Connection management public void Reset() { if (_isDisconnected == false) { try { _isDisconnected = true; leaveCurrentRoom("", false); if (Messenger != null) Messenger.Clear(); userManager.removeUser(userID); } catch { } } } internal void Disconnect() { _ConnectionManager.Close(); } internal void Disconnect(int ms) { new timedDisconnector(delDisconnectTimed).BeginInvoke(ms, null, null); } private void delDisconnectTimed(int ms) { Thread.Sleep(ms); Disconnect(); } #endregion internal void sendData(string packet) { _ConnectionManager.sendData(packet); } internal void sendAlert(string Message) { sendData("BK" + stringManager.fixWords(Message) + Convert.ToChar(2)); } internal void sendModAlert(string Message) { sendData("B!" + stringManager.fixWords(Message) + Convert.ToChar(2)); } internal void SetHandler(messageHandler _Handler) { this.Handler = _Handler; } public string IP { get { return _ConnectionManager.connectionRemoteIP; } } #region Packet processing #region Non-logged in packet processing 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) { Disconnect(1000); sendModAlert("Problème !."); Out.WriteError("Probleme avec cet utilisateur."); return; } if (userManager.getBanReason(myID) != "") { sendData("@c" + userManager.getBanReason(myID)); Disconnect(1000); return; } this.userID = myID; DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT name,figure,sex,mission,rank,wordFilterDisabled,rpxid,changename,rpx_type,timeOnline,dateOnline FROM users WHERE id = '" + this.userID + "'"); } _Username = Convert.ToString(dRow[0]); _Figure = Convert.ToString(dRow[1]); _Sex = Convert.ToChar(dRow[2]); _Mission = stringManager.fixWords(Convert.ToString(dRow[3])); _Rank = Convert.ToByte(dRow[4]); _FilterDisabled = Convert.ToBoolean(dRow[5]); Changename = Convert.ToInt32(dRow[7]); rpxid = Convert.ToString(dRow[6]); rpxType = Convert.ToString(dRow[8]); _noHeightLimit = true; _stackRugs = true; _violationsFilter = 0; _maxFriends = Config.MaximumFriends; sBrb = new ThreadStart(Brb); ImBrb = new Thread(sBrb); if (Convert.ToString(dRow[10]) == "" || Convert.ToString(dRow[10]) == "00") { startGame = DateTime.Now; } else { startGame = Convert.ToDateTime(dRow[10]); } 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 = '10' WHERE id = " + userID); Respect = 10; } else Respect = dbClient.getInt("SELECT respect_left FROM users WHERE id = " + userID); } this._fuserights = FuserightManager.GenerateFuseList(this.userID); sendData("@B" + rankManager.fuseRights(this)); sendData("FdH"); sendData("DbIH"); sendData("@C"); sendData("GGH" + Convert.ToChar(2)); if (Config.enableWelcomeMessage) sendAlert(stringManager.getString("welcomemessage_text")); 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 { 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 system_vouchers WHERE voucher = @code")) { int voucherAmount = dbClient.getInt("SELECT credits FROM system_vouchers WHERE voucher = @code"); dbClient.runQuery("DELETE FROM system_vouchers WHERE voucher = @code LIMIT 1"); _Credits += voucherAmount; refreshValueables(true, false, _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 { if (_updatePixels > 0) refreshValueables(false, true, _updatePixels); refreshValueables(true, false, 0); } 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(); } #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"); string friendRequest = dbClient.getString("SELECT friendRequestsAllowed FROM users WHERE name = @username"); if (friendRequest == "true") { if (toID > 0 && Messenger.hasFriendRequests(toID) == false && Messenger.hasFriendship(toID) == false) { 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)); } } else sendAlert("No se puede enviar la petición. Este usuario no acepta a nuevos amigos."); } } } 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, false); // Filter swearwords if (Messenger.containsOnlineBuddy(buddyID)) // Buddy online { userManager.getUser(buddyID).sendData("BF" + Encoding.encodeVL64(userID) + Message + Convert.ToChar(2)); userManager.addInstantMessage(_Username, buddyID, Message, 0); } 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 ProcessPacketDF() // Messenger - follow buddy to a room { if (Messenger != null) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { int ID = Encoding.decodeVL64(currentPacket.Substring(2)); string followFriend = dbClient.getString("SELECT followFriendMode FROM users WHERE id = '" + ID + "'"); int errorID = -1; if (Messenger.hasFriendship(ID)) // Has friendship with user { if (userManager.containsUser(ID)) // User is online { virtualUser _User = userManager.getUser(ID); if (_User._roomID > 0) // User is in room { if (followFriend == "1") { if (_User._inPublicroom) sendData("D^" + "I" + Encoding.encodeVL64(_User._roomID)); else sendData("D^" + "H" + Encoding.encodeVL64(_User._roomID)); } else // Usuario no permite que lo sigan. errorID = 3; } else // User is not in a room errorID = 2; } else // User is offline errorID = 1; } else // User is not this virtual user's friend errorID = 0; if (errorID != -1) // Error occured sendData("E]" + Encoding.encodeVL64(errorID)); } } } 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); Message = stringManager.filterSwearwords(Message, false); // Filter swearwords 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); userManager.addInstantMessage(_Username, IDs[i], Message, 1); } } } catch { sendAlert("Se ha encontrado un error al mandar las invitaciones. Por favor intentalo más tarde."); } } #endregion #region Navigator actions internal void ProcessPacketBV() // Navigator - navigate through rooms and categories { int hideFull = Encoding.decodeVL64(currentPacket.Substring(2, 1)); int cataID = Encoding.decodeVL64(currentPacket.Substring(3)); string Name = navigatorManager.getNameAcces(_Rank, cataID); 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)); } } 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()); sendData("Dj" + Holo.Encoding.encodeVL64(userManager.userCount) + Holo.Encoding.encodeVL64(roomManager.roomCount)); } internal void ProcessPacketBW() // Navigator - request index of categories to place guestroom on { 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) { sendData("E_" + Encoding.encodeVL64(3) + navigatorManager.getRandomRooms()); } internal void ProcessPacketAGP() // Navigator - view user's own guestrooms @P { 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 { 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 { 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 { 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, false).Replace("\n", "")); 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(Convert.ToInt32(roomID)) + stringManager.filterSwearwords(roomName, false) + 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)), false); 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)), false); 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, false).Replace("\n", "")); 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"), "Esta sala ha sido eliminada."); } } 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 { sendData("@R"); leaveCurrentRoom("", false); } internal void getAdverting() { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT * FROM cms_advertings ORDER BY RAND() LIMIT 1"); if (dRow.Table.Rows.Count > 0) sendData("DB" + Config.Rooms_LoadAvertisement_img + Convert.ToChar(2) + dRow["destination_url"].ToString()); else sendData("DB0"); } } internal void ProcessPacketBv() // Enter room - loading screen advertisement { Random Random = new Random(); int Show_Ads = Random.Next(0, 50); if (Config.Rooms_LoadAvertisement_img == "" || Show_Ads >= 10) sendData("DB0"); else getAdverting(); } internal void ProcessPacketAGB() // Enter room - determine room and check state + max visitors override @B { int roomID = Encoding.decodeVL64(currentPacket.Substring(3)); bool isPublicroom = false; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if ("" == dbClient.getString("SELECT owner FROM rooms WHERE id = '" + roomID + "'")) { isPublicroom = true; } } sendData("Dj" + Holo.Encoding.encodeVL64(userManager.userCount) + Holo.Encoding.encodeVL64(roomManager.roomCount)); sendData("@S"); sendData("Bf" + ""); 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()) { _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); } } 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 (_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); } else if (Room.hasSwimmingPool == true) { sendData("AGdoor closed"); } if (rpxid != "0" && (rpxType == "facebook" || rpxType == "rpx") && Changename == 0 && _inPublicroom == false) sendAlert("¡Bienvenido a Info Hotel! Bueno al parecer tienes un nombre que puede no gustarte ¿Por que no lo cambias?, para ello sigue las siguientes instrucciones:\r1. Teclea en el campo de texto para hablar \":name\" sin las comillas.\r2. Deja un espacio y tu nombre nuevo, ejemplo: \":name Arturo\".\r¡Recuerda que podras utilizar esto solo una vez! Este mensaje aparecera hasta que cambies tu nombre.\rSi no deseas cambiar tu nombre haz el mismo procedimiento pero con \":nameok\"."); } 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(Convert.ToString(targetID)); } else { userManager.setBan(targetID, banHours, Message); Report = userManager.generateBanReport(Convert.ToString(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) { sendModAlert("Has sido bloqueado de la Ayuda Express"); 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"); } sendData("EAH"); userManager.sendToRank(Config.Minimum_CFH_Rank, true, "BT" + Encoding.encodeVL64(cfhID) + Convert.ToChar(2) + "I" + "Enviado: " + 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; string alreadyPick; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { toUserName = dbClient.getString("SELECT username FROM cms_help WHERE id = '" + cfhID + "'"); alreadyPick = dbClient.getString("SELECT picked_up FROM cms_help WHERE id = '" + cfhID + "'"); } if (toUserName == null || alreadyPick == "1") sendAlert(stringManager.getString("cfh_fail")); 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" + "Eliminado" + Convert.ToChar(2) + "Eliminado" + Convert.ToChar(2) + "Eliminado" + 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); 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); 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 (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 ProcessPacketAs() // Room - click door to exit room { if (Room != null && roomUser != null) { isToExit = true; roomUser.goalX = (Room.doorX + 1); roomUser.goalY = Room.doorY; } } 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); } 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"); #region Sistema de Premios por Respetos int respects; respects = dbClient.getInt("SELECT respect_received FROM users WHERE id = '" + receiverUserID + "'"); if (respects == 1) { dbClient.runQuery("INSERT INTO users_badges (userid,badgeid) VALUES ('" + receiverUserID + "','ACH_RespectEarned1')"); refreshValueables(false, true, 20); refreshBadges(); } if (respects == 6) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned2' WHERE badgeid = 'ACH_RespectEarned1' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 20); } if (respects == 16) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned3' WHERE badgeid = 'ACH_RespectEarned2' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 20); } if (respects == 66) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned4' WHERE badgeid = 'ACH_RespectEarned3' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 50); } if (respects == 166) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned5' WHERE badgeid = 'ACH_RespectEarned4' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 100); } if (respects == 366) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned6' WHERE badgeid = 'ACH_RespectEarned5' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 200); } if (respects == 566) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned7' WHERE badgeid = 'ACH_RespectEarned6' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 200); } if (respects == 766) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned8' WHERE badgeid = 'ACH_RespectEarned7' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 200); } if (respects == 966) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned9' WHERE badgeid = 'ACH_RespectEarned8' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 200); } if (respects == 1166) { dbClient.runQuery("UPDATE users_badges SET badgeid = 'ACH_RespectEarned10' WHERE badgeid = 'ACH_RespectEarned9' AND userid = '" + receiverUserID + "'"); refreshBadges(); refreshValueables(false, true, 400); } #endregion 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) + stringManager.fixWords(Convert.ToString(dRow["name"])) + Convert.ToChar(2) + stringManager.fixWords(Convert.ToString(dRow["description"])) + Convert.ToChar(2) + gRoom + roomName + Convert.ToChar(2)); } } } internal void ProcessPacketAUL() // Statuses - wave A^ { if (Room != null && roomUser != null && statusID != "Ge") { 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 && statusID != "Ge") { 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 (Room != null && roomUser != null) { string Item = currentPacket.Substring(2); if (statusManager.containsStatus("lay") || Item.Contains("/")) return; try { int nItem = int.Parse(Item); if (nItem < 1 || nItem > 26) return; } catch { if (_inPublicroom == false && Item != "Water" && Item != "Milk" && Item != "Juice") // Not a drink that can be retrieved from the infobus minibar return; } roomUser.statusManager.carryItem(int.Parse(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 hearShoutTalk(virtualRoomUser sourceUser, string Message, int gestureID) { Message = stringManager.filterSwearwords(Message, _FilterDisabled); sendData("@Z" + Encoding.encodeVL64(sourceUser.roomUID) + Message + Convert.ToChar(2) + Encoding.encodeVL64(gestureID)); } internal void hearSayTalk(virtualRoomUser sourceUser, string Message, int gestureID) { Message = stringManager.filterSwearwords(Message, _FilterDisabled); sendData("@X" + Encoding.encodeVL64(sourceUser.roomUID) + Message + Convert.ToChar(2) + Encoding.encodeVL64(gestureID)); } internal bool containsWord(string[] Words) { for (int i = 0; i < Words.Length; i++) if (Words[i] == stringManager.filterCensor) return true; return false; } internal void ProcessPacketAGw() // Chat - shout @w { try { if (_isMuted == false && (Room != null && roomUser != null)) { string Message = currentPacket.Substring(4).Replace("\n", ""); if (Message.Length < 90) { userManager.addChatMessage(_Username, _roomID, Message); string TheMessage = Message.ToLower(); string[] messageWords = TheMessage.Split(' '); if (containsWord(messageWords)) { _violationsFilter++; if (_violationsFilter == 1 || _violationsFilter == 2) sendData("BK" + stringManager.fixWords("El lenguaje que estás utilizando no es adecuado para Habbo Hotel. Por favor, modera tu comportamiento o serás penalizad@") + Convert.ToChar(2)); // MENSAJE AUTO else if (_violationsFilter > 2 && _isMuted == false) { sendData("BK" + stringManager.fixWords("No podrás comunicarte con el resto de usuari@s por no haber moderado tu comportamiento") + Convert.ToChar(2)); // MENSAJE AUTO _isMuted = true; } } 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); if (Receiver != _Username && Message.Length < 90) { Message = stringManager.filterSwearwords(Message.Replace("\n", ""), _FilterDisabled); userManager.addChatMessage(_Username, _roomID, 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; else if (_Target._isOwner || _Target._Rank > _Rank) return; else if (rankManager.containsRight(_Target, "fuse_kick_immunity", userID) || rankManager.containsRight(_Target, "fuse_any_room_controller", userID)) return; else { _Target.isToExit = true; _Target.roomUser.goalX = (Room.doorX + 1); _Target.roomUser.goalY = Room.doorY; //_Target.leaveCurrentRoom("Has sido expulsado de la sala.", true); } } 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 (Room == null || roomUser == null || _inPublicroom || _hasRights == false) return; else { int Target = Encoding.decodeVL64(currentPacket.Substring(2)); virtualUser _Target = userManager.getUser(Target); if (_Target._roomID != _roomID) return; else if (_Target._isOwner || _Target._Rank > _Rank) return; else if (rankManager.containsRight(_Target, "fuse_kick_immunity", userID) || rankManager.containsRight(_Target, "fuse_any_room_controller", userID)) return; else { 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.isToExit = true; _Target.roomUser.goalX = (Room.doorX + 1); _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; } } } #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; 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 { 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) { if (Cost_Pixels > 0 && (Cost_Pixels / 2) > 0) { Cost_Pixels = Cost_Pixels / 2; } if (Cost > 0 && (Cost / 2) > 0) { Cost = Cost / 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, false)); dbClient1.runQuery("INSERT INTO furniture(tid,ownerid,var) VALUES (@tid,@ownerid,@var)"); presentBoxID = dbClient1.getInt("SELECT MAX(id) FROM furniture"); } roomID = -1; } _Credits = _Credits - Cost; _Pixels = _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 (catalogueManager.getTemplate(spriteID).Sprite.Substring(0, 3) == "pet") { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (Config.getTableEntry("purchase_pets") == "0") { dbClient.runQuery("DELETE FROM furniture WHERE id = '" + catalogueManager.lastItemID + "'"); sendAlert("Lo sentimos, pero la compra de mascotas esta desactivada."); refreshValueables(true, false, 25); return; } else { string[] Props = VarItem.Split("\n".ToCharArray()); string Name = Props[0]; string Race = Props[1]; string Colour = Props[2]; int lastPetID = dbClient.getInt("SELECT MAX (id) FROM pets"); string Message = Encoding.encodeVL64(lastPetID) + Name + Convert.ToChar(2) + catalogueManager.getTemplate(spriteID).typeID + Convert.ToChar(32) + Race + Convert.ToChar(32) + Colour + Convert.ToChar(2) + Holo.Encoding.encodeVL64(catalogueManager.getTemplate(spriteID).typeID); sendData("I_" + Message); dbClient.AddParamWithValue("@nestid", catalogueManager.lastItemID); dbClient.AddParamWithValue("@ownerid", userID); dbClient.AddParamWithValue("@petname", stringManager.filterSwearwords(Name, false).Replace("\n", "")); dbClient.AddParamWithValue("@petrace", Race); dbClient.AddParamWithValue("@petcolour", Colour); dbClient.AddParamWithValue("@pettype", catalogueManager.getTemplate(spriteID).Sprite.Replace("pet", "")); dbClient.AddParamWithValue("@bought", DateTime.Now); dbClient.runQuery("INSERT INTO pets(nest_id,owner,name,race,colour,type,bought,roomid,hungry) VALUES (@nestid,@ownerid,@petname,@petrace,@petcolour,@pettype,@bought,'0', '10')"); ProcessPacketnx(); refreshHand("last"); return; } } } 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, false); 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, false); 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 catalogueManager.handlePurchase(spriteID, receiverID, roomID, "0", presentBoxID, teleportid1); } if (receiverID == userID) refreshHand("last"); else if (userManager.containsUser(receiverID)) { userManager.getUser(receiverID).refreshHand("last"); } } #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; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { 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; 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 if (dbClient.findsResult("SELECT id FROM pets WHERE nest_id = '" + itemID + "'")) // Pet nest { DataRow dRow = dbClient.getRow("SELECT id, x, y FROM pets WHERE roomid = '" + Room.roomID + "'"); if (dRow.Table.Rows.Count <= 5) { string[] locDetails = currentPacket.Split(' '); int X = int.Parse(locDetails[1]); int Y = int.Parse(locDetails[2]); byte Z = byte.Parse(locDetails[3]); Room.floorItemManager.placeItem(itemID, templateID, X, Y, 4, Z, true); //"f:" + "1" (0 = Dog, 1 = Cat, 2 = Croco) + " " + "001" (000 = race 1, 001 = race 2 etc.) + " " + "000000" (Hex colour) dbClient.runQuery("UPDATE pets SET roomid = '" + Room.roomID + "', room_uid = '" + Room.roomID + "', x = '" + X + "', y = '" + Y + "', z = '" + Z + "' WHERE nest_id = '" + itemID + "'"); Room._Pets.Clear(); Room.loadPets(); //Room.addPet(Convert.ToInt32(dRow[0]), Convert.ToInt32(dRow[1]), Convert.ToInt32(dRow[2]), true); } else { sendAlert("Lo sentimos, pero no puedes tener más mascotas en esta sala."); return; } } 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, true); } } } 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)); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (dbClient.findsResult("SELECT id FROM pets WHERE nest_id = '" + itemID + "' AND roomid = '" + Room.roomID + "'")) { DataRow dRow = dbClient.getRow("SELECT room_uid FROM pets WHERE nest_id = '" + itemID + "' AND roomid = '" + Room.roomID + "'"); Room.floorItemManager.removeItem(itemID, userID); dbClient.runQuery("UPDATE pets SET roomid = '0', room_uid = '0', x = '0', y = '0', z = '0' WHERE nest_id = '" + itemID + "'"); Room._Pets.Clear(); Room.loadPets(); //Room.removePet(Convert.ToInt32(dRow[0])); } else 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; 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() { if (Encoding.decodeVL64(currentPacket.Substring(2)) < 0) return; this.Room.sendData("Dx" + currentPacket.Substring(2) + "IH"); this.roomUser.goalX = -1; int wayInit = 0; /* The x square */ int x = this.roomUser.X; if (x == (this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).X + 1)) wayInit = 1; if (x == (this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).X - 1)) wayInit = 2; /* The y square */ int y = this.roomUser.Y; if (y == (this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).Y + 1)) wayInit = 4; if (y == (this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).Y - 1)) wayInit = 3; this.Room.moveUser(this.roomUser, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).X, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).Y, true); Thread.Sleep(500); if (this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).Sprite.Contains("one_way_door*")) { switch (wayInit) { case 2: this.Room.moveUser(this.roomUser, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).X + 1, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).Y, true); break; case 1: this.Room.moveUser(this.roomUser, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).X - 1, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).Y, true); break; case 3: this.Room.moveUser(this.roomUser, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).X, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).Y + 1, true); break; case 4: this.Room.moveUser(this.roomUser, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).X, this.Room.floorItemManager.getItem(Encoding.decodeVL64(currentPacket.Substring(2))).Y - 1, true); break; } this.Room.sendData("Dx" + currentPacket.Substring(2) + "HH", 500); } 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, false).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, false)); 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, false)); 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(true); 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(true); 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(false); } } } #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 Pets internal void ProcessPacketnz() { int petID = Encoding.decodeVL64(currentPacket.Substring(2)); int X = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(petID).Length)); int Y = Encoding.decodeVL64(currentPacket.Substring(2 + Encoding.encodeVL64(petID).Length + Encoding.encodeVL64(X).Length)); Room._Pets.Clear(); Room.loadPets(); sendData(@"I\" + Holo.Encoding.encodeVL64(petID)); } internal void ProcessPacketny() { int petID = Encoding.decodeVL64(currentPacket.Substring(2)); sendData("IY" + Room.getPetString(petID)); } internal void ProcessPacketApeJ() { sendData("@dH"); } internal void ProcessPacketnx() { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("@ownerid", userID); DataTable dTable = dbClient.ReadDataTable("SELECT * FROM pets WHERE owner = @ownerid AND roomid = '0'"); StringBuilder Builder = new StringBuilder(); int count = 0; foreach (DataRow dRow in dTable.Rows) { count++; Builder.Append(Holo.Encoding.encodeVL64(int.Parse(dRow["id"].ToString()))); Builder.Append(dRow["name"].ToString()); Builder.Append(Convert.ToChar(2)); Builder.Append(int.Parse(dRow["type"].ToString())); Builder.Append(Convert.ToChar(32)); Builder.Append(dRow["race"].ToString()); Builder.Append(Convert.ToChar(32)); Builder.Append(dRow["colour"].ToString()); Builder.Append(Convert.ToChar(2)); Builder.Append(Holo.Encoding.encodeVL64(int.Parse(dRow["type"].ToString()))); } sendData("IX" + Holo.Encoding.encodeVL64(count) + Builder); } } #endregion #region Lido System internal void ProcessPacketAg() { } internal void ProcessPacketAj() // Dive Packet { if (roomUser.Diving == false || Room == null || roomUser == null) return; int Packet = Encoding.decodeB64(currentPacket.Substring(2, 2)); string DivePacket = currentPacket.Substring(4); Room.sendData("AJ" + roomUser.roomUID + Convert.ToChar(13) + DivePacket); // Dont Works! D: } internal void ProcessPacketAk() { if (roomUser.Diving == false || Room == null || roomUser == null) return; Room.DiveDoorOpen = true; roomUser.walkLock = false; string[] Cords = currentPacket.Substring(2).Split(",".ToCharArray()); int nextX = Int32.Parse(Cords[0]); int nextY = Int32.Parse(Cords[1]); Room.sendData("AGBIGSPLASH position " + nextX + "," + nextY); Room.sendSpecialCast("door", "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 = nextX; roomUser.Y = nextY; roomUser.Diving = false; //roomUser.InQueue = false; roomUser.H = Room.sqFLOORHEIGHT[nextX, nextY]; if (roomUser.H <= 7) statusManager.addStatus("swim", ""); roomUser.goalX = 20; roomUser.goalY = 19; roomUser.walkLock = false; //string[] Votes = roomUser.Votes.Split(','); //int sum = 0; int final = 0; /*for (int i = 0; i < Votes.Length; i++) { sum = sum + Int32.Parse(Votes[i]); } final = sum / Votes.Length; */ //Room.sendSpecialCast("cam1", "showtext " + _Username + " ha/ terminado./ Puntos: " + final); } #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"))); currentPacket = "Et" + currentPacket.Substring(2); ProcessPacketEt(); } } 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)); if (currentPacket.Substring(2) == "M") statusID = ""; 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()) || currentPacket.Contains(stringManager.filterCensor)) sendData("@d" + "I"); // Name is invalid else { sendData("@d" + "H"); // Name is valid } } internal void ProcessPacketBAG() // Pet - Show info about the pet { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { string PetName = currentPacket.Substring(5); string PetName2 = currentPacket.Substring(6); //int PetID = Encoding.decodeVL64(currentPacket.Substring(3, 5 - 2)); string Type; string Hungry; DataRow dRow = dbClient.getRow("SELECT * FROM pets WHERE roomid = '" + _roomID + "' AND (name LIKE '%" + PetName + "%' OR name LIKE '%" + PetName2 + "%') LIMIT 1"); if (dRow.Table.Rows.Count > 0) { if (dRow["type"].ToString() == "0") Type = "Chien"; else if (dRow["type"].ToString() == "1") Type = "Chat"; else if (dRow["type"].ToString() == "2") Type = "Croco"; else Type = "Desconocido"; if (Convert.ToInt32(dRow["hungry"]) <= 20) Hungry = "AFFAMER !"; else if (Convert.ToInt32(dRow["hungry"]) <= 40) Hungry = "Ca gargouille"; else if (Convert.ToInt32(dRow["hungry"]) <= 60) Hungry = "Un peu faim :/"; else if (Convert.ToInt32(dRow["hungry"]) <= 80) Hungry = "Satisfait"; else if (Convert.ToInt32(dRow["hungry"]) <= 100) Hungry = "NIQUEL !"; else Hungry = "Raro"; sendAlert("Info sur l'animal.\rNom: " + dRow["name"].ToString() + ".\rProprio: " + userManager.getUserName(Convert.ToInt32(dRow["owner"])) + "\rRace: " + Type + "\rDate de naissance: " + dRow["bought"].ToString() + "\rEntrainement: " + dRow["train"].ToString() + "/100\rFaim: " + Hungry); } else sendAlert("Hubo un error, al parecer la mascota no existe."); } } #endregion #region Infobus internal void ProcessPacketAq() { DataRow nexroomID; if (Config.InfobusOpen != true) { sendData("BK" + stringManager.fixWords(stringManager.getString("room_infobus_closed")) + Convert.ToChar(2)); } else { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { nexroomID = dbClient.getRow("SELECT id FROM rooms WHERE model = 'park_b' LIMIT 1"); } if (nexroomID.Table.Rows.Count > 0) { Room.removeUser(roomUser.roomID, false, ""); roomUser.User.sendData("D^" + "I" + Encoding.encodeVL64(Convert.ToInt32(nexroomID["id"]))); } } } internal void ProcessPacketAo() { DataRow nexroomID; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { nexroomID = dbClient.getRow("SELECT id FROM rooms WHERE model = 'park_a' LIMIT 1"); } if (nexroomID.Table.Rows.Count > 0) { Room.removeUser(roomUser.roomID, false, ""); roomUser.User.sendData("D^" + "I" + Encoding.encodeVL64(Convert.ToInt32(nexroomID["id"]))); } } #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 internal void refreshAppearance(bool Reload, bool refreshSettings, bool refreshRoom) { if (Reload) { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dRow = dbClient.getRow("SELECT name,figure,sex,mission,rank FROM users WHERE id = '" + userID + "'"); } _Username = Convert.ToString(dRow["name"]); _Figure = Convert.ToString(dRow["figure"]); _Sex = Convert.ToChar(dRow["sex"]); _Rank = Convert.ToByte(dRow["rank"]); _Mission = stringManager.fixWords(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)); } internal void refreshValueables(bool RCredits, bool RPixels, int Amount) { 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"); if (RCredits == true) { if (Amount > 0) { int Credits = _Credits + Amount; sendData("@F" + Credits); } else sendData("@F" + _Credits); } if (RPixels == true) { if (Amount > 0) { int Pixels = _Pixels + Amount; sendData("Fv" + Encoding.encodeVL64(Pixels) + Encoding.encodeVL64(Amount)); dbClient.runQuery("UPDATE users SET pixels = '" + Pixels + "' WHERE id = '" + userID + "' LIMIT 1"); } else sendData("Fv" + Encoding.encodeVL64(_Pixels) + Encoding.encodeVL64(1)); } } } 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"); } 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 * FROM system_archievements ORDER BY indexid ASC"); } string[] myBadges = dataHandling.dColToArray(col1); string[] myBadgeSlotIDs = dataHandling.dColToArray(col2); 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 { _badgeSlotIDs.Add(0); } badgeCount++; _Badges.Add(myBadges[i]); sbMessage.Append(myBadges[i] + Convert.ToChar(2)); } } foreach (DataRow drow in col3.Table.Rows) { listArchievements.Append(Encoding.encodeVL64(Convert.ToInt32(drow["badgeid"])) + Encoding.encodeVL64(Convert.ToInt32(drow["status"])) + Convert.ToString(drow["badgecode"]) + Convert.ToChar(2)); } sendData("Ce" + Encoding.encodeVL64(badgeCount) + sbMessage.ToString() + "H"); sendData("Ft" + Encoding.encodeVL64(col3.Table.Rows.Count) + listArchievements.ToString()); //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); } 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 + "'"); } } } 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); } } 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()); } } internal void abortTrade(bool realAbort) { if (Room != null && Room.containsUser(_tradePartnerRoomUID) && roomUser != null) { virtualUser Partner = Room.getUser(_tradePartnerRoomUID); this.sendData("An"); Partner.sendData("An"); if (realAbort == false) { sendAlert("Le Troc c'est bien terminé !"); } this.refreshHand("update"); 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 internal void Brb() { while (true) { try { Room.sendShout(roomUser, " Je suis absent"); } catch { } Thread.Sleep(10000); } } internal int startBot = 0; #region Misc voids private bool isSpeechCommand(string Text) { string[] args = Text.Split(' '); try { switch (args[0].ToLower()) // arg[0] = command itself { #region Public commands case "allowwalk": { if (_isOwner == false || _inPublicroom || Room == null) return false; else { int allowWalk = 0; if (args[1] == "1") { allowWalk = 1; sendAlert("¡Ahora los usuarios pueden caminar entre ellos en tu Sala!"); } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE rooms SET allow_walkthrough = '" + allowWalk + "' WHERE id = '" + _roomID + "' LIMIT 1"); } } break; } case "toutprendre": { if (_isOwner == false || _inPublicroom || Room == null) return false; else { System.Collections.Hashtable Furnis_floor = (System.Collections.Hashtable)Room.floorItemManager._Items.Clone(); System.Collections.Hashtable Furnis_wall = (System.Collections.Hashtable)Room.wallItemManager._Items.Clone(); foreach (Holo.Virtual.Rooms.Items.wallItem Item in Furnis_wall.Values) //wallitems { Room.wallItemManager.removeItem(Item.ID, userID); } foreach (Holo.Virtual.Rooms.Items.floorItem Item in Furnis_floor.Values) // flooritems { Room.floorItemManager.removeItem(Item.ID, userID); } refreshHand("update"); } break; } case "about": { sendModAlert("Ce serveur est basé sur InfoEmu \r" + "Modifié par Killian\r" + "Copyright (C) 2o1o Nillus, Kolesias123 & Killian.\r" + "\r" + "Modifié le 26 Aout a 01:35\r" + "Pour Habbo Story | Modif By Killian\r" + "HS EMU"); break; } case "videtamain": { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("DELETE FROM furniture WHERE ownerid = '" + userID + "' AND roomid = '0'"); refreshHand("new"); } break; } case "poof": { refreshAppearance(true, true, true); refreshValueables(true, true, 0); refreshBadges(); break; } case "name": { if (rpxid == "0" || rpxType == "habboid" || Changename == 1) return false; else { string newName = args[1]; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { DataRow dRow = dbClient.getRow("SELECT * FROM users WHERE name = '" + newName + "' LIMIT 1"); if (dRow.Table.Rows.Count > 0) sendAlert("Lo sentimos, pero el nombre se encuentra ocupado."); else if (newName.Contains("MOD-") || newName.Contains("VIP-") || newName.Contains(stringManager.filterCensor)) sendAlert("Lo sentimos, pero este nombre no es válido."); else { dbClient.runQuery("UPDATE users SET name = '" + newName + "', changename = '1' WHERE id = '" + userID + "' LIMIT 1"); dbClient.runQuery("UPDATE rooms SET owner = '" + newName + "' WHERE owner = '" + _Username + "'"); dbClient.runQuery("INSERT INTO users_badges (userid,badgeid) VALUES ('" + userID + "','ACH_Name1')"); Changename = 1; _Username = newName; refreshBadges(); refreshAppearance(true, true, true); sendAlert("¡Felicidades! Has cambiado tu nombre con éxito.\rPara ver los cambios por favor reinicia la Sala.\r¡Disfruta del Hotel!"); } } } break; } case "nameok": { if (rpxid == "0" || rpxType == "habboid" || Changename == 1) return false; else { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET changename = '1' WHERE id = '" + userID + "' LIMIT 1"); Changename = 1; sendAlert("¡Listo! Tu nombre ha sido confirmado con éxito. ¡Disfruta del Hotel!"); } } break; } case "bisous": { virtualUser loveUsername = userManager.getUser(args[1]); if (loveUsername._isLoggedIn) { currentPacket = "EtQB"; // QB = Love Effect ProcessPacketEt(); loveUsername.currentPacket = "EtQB"; // QB = Love Effect loveUsername.ProcessPacketEt(); } break; } case "deteste": { virtualUser hateUsername = userManager.getUser(args[1]); if (hateUsername._isLoggedIn) { currentPacket = "EtQF"; // QB = Fire Effect ProcessPacketEt(); hateUsername.currentPacket = "EtQF"; // QB = Fire Effect hateUsername.ProcessPacketEt(); } break; } case "abs": { if (ImBrb.IsAlive) { ImBrb.Abort(); sendAlert("Tu es de retour"); } else { ImBrb.Priority = ThreadPriority.BelowNormal; ImBrb.Start(); sendAlert("Tu es Absent"); } break; } #endregion #region Moderacy commands case "shutdown": { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Rank <= 6) return false; else { userManager.sendData("Dc" + Encoding.encodeVL64(0)); staffManager.addStaffMessage("shutdown", userID, 0, "mm=" + 0, ""); Out.WriteError("El servidor ha sido apagado por un Administrador."); Eucalypt.Shutdown(); break; } } } case "teleport": { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Rank <= 3) return false; else { roomUser.SPECIAL_TELEPORTABLE = (roomUser.SPECIAL_TELEPORTABLE != true); refreshAppearance(false, false, true); } break; } } case "warp": { if (_Rank <= 3) return false; else { int X = int.Parse(args[1]); int Y = int.Parse(args[2]); int[] mapLimits = Room.getMapBorders(); if (X <= mapLimits[0] && Y <= mapLimits[1] && X >= 0 && Y >= 0) // Abort the teleport if they are trying to teleport outside the array { Room.sqUNIT[X, Y] = Room.walkthrough(roomUser.roomID); // Block the new tile Room.sqUNIT[roomUser.X, roomUser.Y] = false; // Unblock the old tile roomUser.X = X; roomUser.Y = Y; roomUser.goalX = -1; Room.Refresh(roomUser); refreshAppearance(false, false, true); } else sendModAlert("¡Coordenadas no válidas!"); } break; } case "alert": { if (_Rank <= 4) return false; else { virtualUser Target = userManager.getUser(args[1]); string Message = stringManager.wrapParameters(args, 2); Target.sendModAlert(Message); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("alert", userID, Target.userID, args[2], ""); } break; } case "roomalert": { if (_Rank <= 5) return false; else { string Message = Text.Substring(10); Room.sendData("B!" + Message + Convert.ToChar(2)); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("ralert", userID, Room.roomID, Message, ""); } break; } case "kick": { if (_Rank <= 4) return false; else { virtualUser Target = userManager.getUser(args[1]); if (Target._Rank < this._Rank) { string Message = ""; if (args.Length > 2) Message = stringManager.wrapParameters(args, 2); Target.Room.removeUser(Target.roomUser.roomUID, true, Message); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("kick", userID, Target.userID, Message, ""); } else sendAlert(stringManager.getString("scommand_failed")); } break; } case "kickroom": { if (_Rank <= 5) return false; else { string Message = stringManager.wrapParameters(args, 1); Room.kickUsers(_Rank, Message); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("rkick", userID, Room.roomID, Message, ""); } break; } case "mute": { if (_Rank <= 4) return false; else { virtualUser Target = userManager.getUser(args[1]); if (Target._Rank < _Rank && Target._isMuted == false) { string Message = stringManager.wrapParameters(args, 2); Target._isMuted = true; Target.sendModAlert(stringManager.getString("scommand_muted") + "\r" + Message); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("mute", userID, Target.userID, Message, ""); } else sendAlert(stringManager.getString("scommand_failed")); } break; } case "unmute": { if (_Rank <= 4) return false; else { virtualUser Target = userManager.getUser(args[1]); if (Target._Rank < _Rank && Target._isMuted) { Target._isMuted = false; Target.sendModAlert(stringManager.getString("scommand_unmuted")); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("unmute", userID, Target.userID, "", ""); } else sendAlert(stringManager.getString("scommand_failed")); } break; } case "muteroom": { if (_Rank <= 5) return false; else { string Message = stringManager.wrapParameters(args, 1); Room.muteUsers(_Rank, Message); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("rmute", userID, Room.roomID, Message, ""); } break; } case "unmuteroom": { if (_Rank <= 5) return false; else { Room.unmuteUsers(_Rank); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("runmute", userID, Room.roomID, "", ""); } break; } case "ban": { if (_Rank <= 4) return false; else { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", args[1]); dRow = dbClient.getRow("SELECT id,rank FROM users WHERE name = @name"); } if (dRow.Table.Rows.Count == 0) sendAlert(stringManager.getString("modtool_actionfailed") + "\r" + stringManager.getString("modtool_usernotfound")); else if (Convert.ToByte(dRow["rank"]) > _Rank) sendAlert(stringManager.getString("modtool_actionfailed") + "\r" + stringManager.getString("modtool_rankerror")); else { int banHours = int.Parse(args[2]); string Reason = stringManager.wrapParameters(args, 3); if (banHours == 0 || Reason == "") sendAlert(stringManager.getString("scommand_failed")); else { userManager.setBan(Convert.ToInt32(dRow["id"]), banHours, Reason); sendAlert(userManager.generateBanReport(Convert.ToString(dRow["id"]))); staffManager.addStaffMessage("ban", userID, Convert.ToInt32(dRow["id"]), Reason, ""); } } } break; } case "superban": { if (_Rank <= 5) return false; else { DataRow dRow; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.AddParamWithValue("name", args[1]); dRow = dbClient.getRow("SELECT id,rank,ipaddress_last FROM users WHERE name = @name"); } if (dRow.Table.Rows.Count == 0) sendAlert(stringManager.getString("modtool_actionfailed") + "\r" + stringManager.getString("modtool_usernotfound")); else if (Convert.ToByte(dRow["rank"]) > _Rank) sendAlert(stringManager.getString("modtool_actionfailed") + "\r" + stringManager.getString("modtool_rankerror")); else { int banHours = int.Parse(args[2]); string Reason = stringManager.wrapParameters(args, 3); if (banHours == 0 || Reason == "") sendAlert(stringManager.getString("scommand_failed")); else { string IP = Convert.ToString(dRow["ipaddress_last"]); userManager.setBan(Convert.ToInt32(dRow["id"]), banHours, Reason); sendAlert(userManager.generateBanReport(IP)); staffManager.addStaffMessage("superban", userID, Convert.ToInt32(dRow["id"]), Reason, ""); } } } break; } case "info": { if (_Rank <= 4) return false; else sendAlert(userManager.generateUserInfo(userManager.getUserID(args[1]), _Rank)); break; } case "find": { if (_Rank <= 5) return false; else { virtualUser Target = userManager.getUser(userManager.getUserID(args[1])); if (Target.Room != null && Target._inPublicroom) { sendData("D^" + "I" + Encoding.encodeVL64(Target._roomID)); } else if (Target.Room != null) { sendData("D^" + "H" + Encoding.encodeVL64(Target._roomID)); } else { sendAlert("Lo sentimos, pero " + Target._Username + " no se encuentra en ninguna Sala."); } } break; } case "search": { if (_Rank <= 5) return false; else { virtualUser Target = userManager.getUser(userManager.getUserID(args[1])); if (Room != null && _inPublicroom) { Target.sendData("D^" + "I" + Encoding.encodeVL64(_roomID)); } else if (Room != null) { Target.sendData("D^" + "H" + Encoding.encodeVL64(_roomID)); } else { sendAlert("Lo sentimos, pero no te encuentras en ninguna Sala."); } } break; } case "allworld": { if (_Rank <= 6) return false; else { Thread Refresher; ThreadStart tStarter = null; tStarter = new ThreadStart(startGet); Refresher = new Thread(tStarter); Refresher.Priority = ThreadPriority.BelowNormal; Refresher.Start(); } break; } case "offline": { if (_Rank <= 6) return false; else { int Minutes = int.Parse(args[1]); userManager.sendData("Dc" + Encoding.encodeVL64(Minutes)); staffManager.addStaffMessage("offline", userID, 0, "mm=" + Minutes, ""); } break; } case "position": { if (_Rank <= 4) return false; else sendData("BK" + "X: " + roomUser.X + "\r" + "Y: " + roomUser.Y + "\r" + "Z: " + roomUser.Z1 + "\r" + "Height: " + roomUser.H + Convert.ToChar(2)); break; } case "freeze": { if (_Rank <= 5) return false; else { string userName = args[1]; virtualUser _User = userManager.getUser(userName); _User.roomUser.walkLock = true; } break; } case "unfreeze": { if (_Rank <= 5) return false; else { string userName = args[1]; virtualUser _User = userManager.getUser(userName); _User.roomUser.walkLock = false; } break; } /* case "whosonline": { System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); System.Collections.Hashtable Users = (System.Collections.Hashtable) foreach (virtualRoomUser User in Users.Values) { } break; } */ #endregion #region Message broadcoasting case "ha": case "hotelalert": { if (_Rank <= 4) return false; else { string Message = Text.Substring(3); userManager.sendData("BK" + Message + Convert.ToChar(2)); staffManager.addStaffMessage("halert", userID, 0, Message, "" + Convert.ToChar(2)); } } break; case "ra": case "rankalert": { if (_Rank <= 4) return false; else { string Message = Text.Substring(3); userManager.sendToRank(_Rank, false, "BK" + stringManager.fixWords(stringManager.getString("scommand_rankalert")) + Message + Convert.ToChar(2)); staffManager.addStaffMessage("rankalert", userID, _Rank, Message, "" + Convert.ToChar(2)); } break; } #endregion #region Special staff commands case "rooms": case "roomsettings": { if (_Rank <= 4 || Room.isPublicroom == true) return false; else { string Step = args[1]; try { if (Step == "help" || Step == "commands" || Step == "what") { sendAlert("Comandos para configuración de Salas:\r" + ":rooms allowwalk <1/0> - Permite cambiar el ajuste de 'traspasar usuarios'\r" + ":rooms ban 0 - Cambia el nombre de la Sala a 'No cumple la Manera Habbo'\r" + ":rooms ban 1 - Cambia el nombre y Kickea a todos los que se encuentran dentro.\r" + ":rooms ban 2 - Cambia el nombre, Kickea y pone la Sala con timbre.\r" + ":rooms ban 3 - Cambia el nombre, Kickea, pone Timbre y cambia el dueño."); } else if (Step == "allowwalk") { int allowWalk = 0; string Step2 = args[2]; if (Step2 == "1") { allowWalk = 1; sendAlert("¡Ahora los usuarios pueden caminar entre ellos en la Sala!"); } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE rooms SET allow_walkthrough = '" + allowWalk + "' WHERE id = '" + _roomID + "' LIMIT 1"); } } else if (Step == "ban") { string Step2 = args[2]; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (Step2 == "0") dbClient.runQuery("UPDATE rooms SET name = 'No cumple la Manera Habbo' WHERE id = '" + _roomID + "' LIMIT 1"); else if (Step2 == "1") { dbClient.runQuery("UPDATE rooms SET name = 'No cumple la Manera Habbo' WHERE id = '" + _roomID + "' LIMIT 1"); Room.kickUsers(_Rank, "Esta Sala no cumple la Manera Habbo"); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("rkick", userID, Room.roomID, "Esta Sala no cumple la Manera Habbo", ""); } else if (Step2 == "2") { dbClient.runQuery("UPDATE rooms SET name = 'No cumple la Manera Habbo', state = '1' WHERE id = '" + _roomID + "' LIMIT 1"); Room.kickUsers(_Rank, "Esta Sala no cumple la Manera Habbo"); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("rkick", userID, Room.roomID, "Esta Sala no cumple la Manera Habbo", ""); } else if (Step2 == "3") { dbClient.runQuery("UPDATE rooms SET name = 'No cumple la Manera Habbo', state = '1', owner = '" + _Username + "' WHERE id = '" + _roomID + "' LIMIT 1"); Room.kickUsers(_Rank, "Esta Sala no cumple la Manera Habbo"); sendAlert(stringManager.getString("scommand_success")); staffManager.addStaffMessage("rkick", userID, Room.roomID, "Esta Sala no cumple la Manera Habbo", ""); } } } } catch { sendAlert("Comandos para configuración de Salas:\r" + ":rooms allowwalk <1/0> - Permite cambiar el ajuste de 'traspasar usuarios'\r" + ":rooms ban 0 - Cambia el nombre de la Sala a 'No cumple la Manera Habbo'\r" + ":rooms ban 1 - Cambia el nombre y Kickea a todos los que se encuentran dentro.\r" + ":rooms ban 2 - Cambia el nombre, Kickea y pone la Sala con timbre.\r" + ":rooms ban 3 - Cambia el nombre, Kickea, pone Timbre y cambia el dueño."); } } break; } case "invisible": { if (_Rank < 5) return false; else { isInvisible = false; if (args[1] == "on") { isInvisible = true; sendAlert("¡Ahora eres invisible! Reinicia la sala."); } } break; } case "nude": using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Rank <= 5) return false; else { dbClient.runQuery("UPDATE users SET figure = 'hd-180-4.hr-831-61' WHERE id = '" + userID + "'"); refreshAppearance(true, true, true); } break; } case "devil": using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Rank <= 5) return false; else { dbClient.runQuery("UPDATE users SET figure = 'hr-125-59.hd-190-3.ch-215-73.lg-280-96.sh-295-110.he-1609-110.fa-1201-' WHERE id = '" + userID + "'"); refreshAppearance(true, true, true); } break; } case "clos": using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Rank <= 5) return false; else { dbClient.runQuery("UPDATE users SET figure = 'hd-180-4.hr-828-61.ha-1006-.fa-1205-92.ch-255-96.lg-285-92.sh-300-96' WHERE id = '" + userID + "'"); refreshAppearance(true, true, true); } break; } case "dance": { if (_Rank <= 4) return false; else { string user = args[1]; virtualUser User = userManager.getUser(args[1]); System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); User.statusManager.addStatus("dance", ""); User.statusManager.Refresh(); } break; } case "masswave": { if (_Rank <= 4) return false; else { System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); foreach (virtualRoomUser User in Users.Values) { User.statusManager.removeStatus("dance"); User.statusManager.handleStatus("wave", "", Config.Statuses_Wave_waveDuration); } } break; } case "massdance": { if (_Rank <= 4) return false; else { System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); foreach (virtualRoomUser User in Users.Values) { User.statusManager.addStatus("dance", ""); User.statusManager.Refresh(); } } break; } case "talk": { if (_Rank <= 5) return false; else { string user = args[1]; string Message = Text.Substring(args[0].Length + user.Length + 2); virtualUser User = userManager.getUser(args[1]); string data = "@Z" + Encoding.encodeVL64(User.roomUser.roomUID) + Message + Convert.ToChar(2); Room.sendData(data); } break; } case "masstalk": { if (_Rank <= 5) return false; else { System.Collections.Hashtable Users = (System.Collections.Hashtable)userManager._Users.Clone(); foreach (virtualUser User in Users.Values) { User.Room.sendShout(User.roomUser, Text.Substring(8)); } } break; } case "masscredits": { if (_Rank <= 6) return false; else { int Credits = int.Parse(args[1]); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET credits = credits + '" + Credits + "'"); } foreach (virtualUser User in userManager._Users.Values) User.refreshValueables(true, false, Credits); } break; } case "roomcredits": { if (_Rank <= 5) return false; else { int Credits = int.Parse(args[1]); System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); foreach (virtualRoomUser User in Users.Values) { using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET credits = credits + '" + Credits + "' WHERE id = '" + User.userID + "'"); } User.User.refreshValueables(true, false, Credits); } } break; } case "masspixels": { if (_Rank <= 6) return false; else { int Pixels = int.Parse(args[1]); foreach (virtualUser User in userManager._Users.Values) User.refreshValueables(false, true, Pixels); } break; } case "roompixels": { if (_Rank <= 5) return false; else { int Pixels = int.Parse(args[1]); System.Collections.Hashtable Users = (System.Collections.Hashtable)Room._Users.Clone(); foreach (virtualRoomUser User in Users.Values) { User.User.refreshValueables(false, true, Pixels); } } break; } case "massbadge": { if (_Rank <= 5) return false; else { string Badge = args[1]; DataTable dTable; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dTable = dbClient.getTable("SELECT id FROM users"); foreach (DataRow dRow in dTable.Rows) { dbClient.runQuery("INSERT INTO users_badges(userid, badgeid) VALUES('" + dRow["id"].ToString() + "', '" + Badge + "')"); } } foreach (virtualUser User in userManager._Users.Values) User.refreshBadges(); } break; } case "credits": using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Rank <= 4) return false; else { virtualUser Target = userManager.getUser(userManager.getUserID(args[1])); int Credits = int.Parse(args[2]); dbClient.runQuery("UPDATE users SET credits = credits + " + Credits + " WHERE id = " + Target.userID + ""); sendAlert("Has enviado con éxito los Créditos"); Target.refreshValueables(true, false, Credits); } break; } case "pixels": using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { virtualUser Target = userManager.getUser(userManager.getUserID(args[1])); int Pixels = int.Parse(args[2]); if (_Rank <= 4) return false; else { dbClient.runQuery("UPDATE users SET pixels = pixels + " + Pixels + " WHERE id = " + Target.userID + ""); sendAlert("Has enviado con éxito los Créditos"); Target.refreshValueables(false, true, Pixels); } break; } case "clon": using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Rank <= 5) return false; else { virtualUser TheUser = userManager.getUser(userManager.getUserID(args[1])); virtualUser Target = userManager.getUser(userManager.getUserID(args[2])); dbClient.runQuery("UPDATE users SET figure = '" + TheUser._Figure + "' WHERE name = '" + Target._Username + "' LIMIT 1"); Target.refreshAppearance(true, true, true); } break; } case "inter": using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { if (_Rank <= 5) return false; else { virtualUser TheUser = userManager.getUser(userManager.getUserID(args[1])); virtualUser Target = userManager.getUser(userManager.getUserID(args[2])); dbClient.runQuery("UPDATE users SET figure = '" + TheUser._Figure + "' WHERE name = '" + Target._Username + "' LIMIT 1"); dbClient.runQuery("UPDATE users SET figure = '" + Target._Figure + "' WHERE name = '" + TheUser._Username + "' LIMIT 1"); Target.refreshAppearance(true, true, true); TheUser.refreshAppearance(true, true, true); } break; } case "badge": using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { virtualUser Target = userManager.getUser(userManager.getUserID(args[1])); string Badge = args[2]; if (_Rank <= 4) return false; else { int Badge_on; Badge_on = dbClient.getInt("SELECT * FROM users_badges WHERE userid = '" + Target.userID + "' AND badgeid = '" + Badge + "'"); if (Badge_on < 1) { dbClient.runQuery("INSERT INTO users_badges (userid,badgeid) VALUES ('" + Target.userID + "','" + Badge + "')"); sendData("BK" + stringManager.fixWords("Has dado la placa " + Badge + " a " + Target._Username + " con éxito.") + Convert.ToChar(2)); Target.refreshBadges(); } else sendData("BK" + "Este usuario ya tiene la Placa."); } break; } case "globalfurni": { if (_Rank <= 5) return false; else { int amount = Convert.ToInt32(args[2]); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { foreach (virtualUser User in userManager._Users.Values) { for (int i = 0; i <= amount; i++) { dbClient.runQuery("INSERT INTO furniture(tid,ownerid,roomid) VALUES (" + args[1] + "," + User.userID + "," + "0)"); } userManager.sendData("BK" + stringManager.fixWords("¡Has recibido nuevo furniture de los Staffs!") + Convert.ToChar(2)); refreshHand("update"); } } } break; } case "happyhour": // Turn on/off Happy Hour { if (_Rank <= 5) return false; else { Config.enableHappyHour = false; int enableHappyHour = 0; switch (args[1]) { case "on": // Turn on HappyHour { Config.enableHappyHour = true; enableHappyHour = 1; break; } } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE system_config SET sval = '" + enableHappyHour + "' WHERE skey = 'enableHappyHour' LIMIT 1"); } Thread Refresher; sendData("HKRC"); ThreadStart tStarter = new ThreadStart(refresh_cat); userManager.sendData("Fy" + Convert.ToChar(1) + "A~" + "HHHM" + Convert.ToChar(2) + catalogueManager.getPageIndex(Convert.ToInt16(_Rank))); Refresher = new Thread(tStarter); Refresher.Priority = ThreadPriority.BelowNormal; Refresher.Start(); } } break; case "infobus": { if (_Rank <= 5) return false; else { if (Room == null || roomUser == null) break; int QueryValue = 0; Config.InfobusOpen = false; if (args[1] == "open") { QueryValue = 1; Config.InfobusOpen = true; } using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE system_config SET sval = '" + QueryValue + "' WHERE skey = 'infobus_active' LIMIT 1"); } if (QueryValue == 1) Room.sendSpecialCast("bus", "open"); else Room.sendSpecialCast("bus", "close"); } break; } case "disconnect": { if (_Rank <= 6) return false; else { virtualUser TheUser = userManager.getUser(userManager.getUserID(args[1])); if (TheUser._Rank < _Rank) { TheUser.sendModAlert("Has sido desconectado por algún Staff"); TheUser.Disconnect(3000); } else { sendModAlert("No es posible desconectar a este usuario."); } } break; } case "upfurni": { if (_Rank <= 4) return false; else { frontFurnis = false; if (args[1] == "on") frontFurnis = true; } break; } case "bots": { if (_Rank <= 4) return false; else { int num = Convert.ToInt32(args[1]); Room._FBots.Clear(); if (num > 6) { sendData("BK" + "¡No puede haber tantos BOTS en la sala! Solo un maximo de 6" + Convert.ToChar(2)); return false; } else { startBot = num; Thread Refresher; ThreadStart tStarter = null; tStarter = new ThreadStart(startBots); Refresher = new Thread(tStarter); Refresher.Priority = ThreadPriority.BelowNormal; Refresher.Start(); } } break; } #region :lido case "lido": // / How to Contact Hotel Staff { sendData("BK" + "Les commandes du lido sont: \r" + ":maillot - Enfile son maillot de bain avant de sauter !\r" + ":sauter - Saute du plongeoir !\r" + "Voila, bonne journee sur HS Wink\r"); break; } #endregion #endregion case "maillot": // costume { using (DatabaseClient KoLoDB = Eucalypt.dbManager.GetClient()) { KoLoDB.runQuery("UPDATE users SET figure_swim = 'ch=s02/53,51,44' WHERE id = '" + userID + "'"); refreshAppearance(false, false, true); sendData("BK" + "Maintenant renter dans le Lido 2 et tape :sauter."); } } break; case "sauter": { sendData("A}"); using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { dbClient.runQuery("UPDATE users SET tuffifatti = tuffifatti + 1 WHERE id = '" + userID + "'"); dbClient.runQuery("UPDATE users SET puntituffi = puntituffi + 10 WHERE id = '" + userID + "'"); } break; } case "botssay": { if (_Rank <= 4) return false; else { string message = args[1]; foreach (virtualFantasyBot roomBot in Room._FBots.Values) { roomBot.Room.sendShout(roomBot, message); } } break; } case "refresh": // Updates certain parts of the server. { if (_Rank <= 6) return false; else { try { Thread Refresher; ThreadStart tStarter = null; switch (args[1]) { case "catalogue": { sendData("HKRC"); tStarter = new ThreadStart(refresh_cat); userManager.sendData("Fy" + Convert.ToChar(1) + "A~" + "HHHM" + Convert.ToChar(2) + catalogueManager.getPageIndex(Convert.ToInt16(_Rank))); break; } case "strings": { tStarter = new ThreadStart(refresh_strings); break; } case "config": { tStarter = new ThreadStart(refresh_config); break; } case "filtro": // Refresh the catalogue { tStarter = new ThreadStart(refresh_filter); break; } case "fuse": // Refresh the catalogue { tStarter = new ThreadStart(refresh_fuse); break; } case "eco": // Refresh the catalogue { tStarter = new ThreadStart(refresh_eco); break; } case "model": // Refresh the modeldata { tStarter = new ThreadStart(refresh_model); break; } case "rooms": // Refresh the rooms { userManager.sendData("DBO" + "\r"); break; } case "thisroom": // Refresh the current rooms { roomUser.Room.sendData("DBO" + "\r"); break; } default: sendData("BK" + stringManager.fixWords(stringManager.getString("scommand_failed")) + Convert.ToChar(2)); return true; } Refresher = new Thread(tStarter); Refresher.Priority = ThreadPriority.BelowNormal; Refresher.Start(); sendData("BK" + stringManager.fixWords(stringManager.getString("scommand_success")) + Convert.ToChar(2)); } catch { sendData("BK" + ":refresh catalogue\r" + ":refresh eco\r" + ":refresh strings\r" + ":refresh config\r" + ":refresh filtro\r" + ":refresh fuse\r" + ":refresh model\r" + ":refresh thisroom\r" + ":refresh rooms\r" + Convert.ToChar(2)); } break; } } #endregion #region Lista de Comandos case "comandes": case "commandes":// commands list { sendAlert("Commandes Publiques:\r" + ":toutprendre - Tout ce qui est dans l'apart va dans ta main.\r" + ":about - Infos sur le serveur.\r" + ":videtamain - Marre de ce qu'il y a dans ta main ? Vide la!\r" + ":bisous - Embrasse celui/celle que tu aimes.\r" + ":deteste - Ah lui je l'aime pas.\r" + ":abs - Cela indique quand tu es absent.\r" + "Si tu veut désactiver l'absence refais :abs\r\r" + "Commandes du lido: Allez dans la piscine B puis faites :\r" + ":maillot - Mettre son maillot de bain ( si deconnexion reviens ).\r" + ":sauter - Plonge du plongeoir\r\r" + "Comandes Hobba:\r" + ":hobbacommands\r" + "Comandes Mod:\r" + ":modcommands\r" + "Comandes Manager:\r" + ":manacommands\r" + "Comandes Staff\r" + ":admincommands\r" + "Merci a Killian pour les commandes :D"); break; } case "hobbacommands": { if (_Rank != 4) return false; sendAlert("Comandes Hobba:\r" + ":teleport - Active ou desactive le teleport.\r" + ":warp - Teleport suivant les donnes X y Y."); break; } case "modcommands": { if (_Rank != 5) return false; sendAlert("Comandos Mod:\r" + ":teleport - Activa o Desactiva la teletransportación.\r" + ":warp - Te teletransportas a la coordenada X y Y.\r" + ":alert - Envia una Alerta a algún usuario.\r" + ":kick - Envia un Kick a algún usuario con Mensaje.\r" + ":mute - Calla a algún usuario.\r" + ":unmute - Descalla a algún usuario.\r" + ":ban - Banea a algún usuario por las horas especificadas.\r" + ":position - Muestra la posición actual de tu personaje.\r" + ":ha - Envia un mensaje a todo el Hotel.\r" + ":ra - Envia un mensaje al equipo administrativo.\r" + ":dance - Hace bailar a algún usuario.\r" + ":masswave - Hace saludar a toda la Sala donde te encuentres.\r" + ":massdance - Hace bailar a toda la Sala donde te encuentres.\r" + ":credits - Da los Créditos especificados al usuario.\r" + ":pixels - Da los Píxeles expecificados al usuario.\r" + ":badge - Da la placa especificada al usuario.\r" + ":rooms help - Lista de comandos para edición de Sala Privada\r" + ":info - Muestra la información de algún usuario.\r" + ":upfurni - Activa o desactiva poder atravezar los furnis.\r" + ":bots - Genera el numero de BOTS indicados.\r" + ":botssay - Hace que todos los BOTS generados hablen el mensaje indicado.\r" + ":allworld - Atrae a todos a esta Sala."); break; } case "manacommands": { if (_Rank != 6) return false; sendAlert("Comandos Manager:\r" + ":teleport - Activa o Desactiva la teletransportación.\r" + ":warp - Te teletransportas a la coordenada X y Y.\r" + ":alert - Envia una Alerta a algún usuario.\r" + ":kick - Envia un Kick a algún usuario con Mensaje.\r" + ":mute - Calla a algún usuario.\r" + ":unmute - Descalla a algún usuario.\r" + ":ban - Banea a algún usuario por las horas especificadas.\r" + ":position - Muestra la posición actual de tu personaje.\r" + ":ha - Envia un mensaje a todo el Hotel.\r" + ":ra - Envia un mensaje al equipo administrativo.\r" + ":dance - Hace bailar a algún usuario.\r" + ":masswave - Hace saludar a toda la Sala donde te encuentres.\r" + ":massdance - Hace bailar a toda la Sala donde te encuentres.\r" + ":credits - Da los Créditos especificados al usuario.\r" + ":pixels - Da los Píxeles expecificados al usuario.\r" + ":badge - Da la placa especificada al usuario.\r" + ":roomalert - Envia un mensaje a toda la Sala donde te encuentres.\r" + ":kickroom - Kickea a toda la Sala con Mensaje.\r" + ":muteroom - Calla a toda la Sala con Mensaje.\r" + ":unmuteroom - Descalla a toda la Sala.\r" + ":superban - Banea a algún usuario con IP por las horas especificadas.\r" + ":info - Muestra la información de algún usuario.\r" + ":find - Te lleva a la Sala donde esta el usuario.\r" + ":search - Te teletransporta al usuario a tu Sala donde te encuentras.\r" + ":freeze - Congela a algún usuario sin que se pueda mover.\r" + ":unfreeze - Descongela a algún usuario."); sendAlert("Comandos Manager: (Página 2)\r" + ":invisible - Te hace invisible totalmente sin que te vean los demás (En pruebas)\r" + ":nude - Te da una figura de un desnudo.\r" + ":devil - Te da una figura de un diablo.\r" + ":clos - Te da una figura de un Santa Clos.\r" + ":talk - Puedes hablar por alguien (El usuario especificado).\r" + ":masstalk - Puedes hablar por toda la Sala.\r" + ":massbadge - Da la placa especificada a todos.\r" + ":clon - Da la figura del Usuario 1 al Usuario 2.\r" + ":inter - Intercambia las figuras de los Usuarios.\r" + ":globalfurni - Da el furni con (tid) a todos.\r" + ":happyhour - Activa o Desactiva la 'Hora Feliz'.\r" + ":infobus - Abre o Cierra el Infobus.\r" + ":rooms help - Lista de comandos para edición de Sala Privada\r" + ":roomcredits - Da los Créditos especificados a todos dentro de la Sala.\r" + ":upfurni - Activa o desactiva poder atravezar los furnis.\r" + ":bots - Genera el numero de BOTS indicados.\r" + ":botssay - Hace que todos los BOTS generados hablen el mensaje indicado.\r" + ":allworld - Atrae a todos a esta Sala."); break; } case "admincommands": { if (_Rank != 7) return false; sendAlert("Comandos Staff:\r" + ":teleport - Activa o Desactiva la teletransportación.\r" + ":warp - Te teletransportas a la coordenada X y Y.\r" + ":alert - Envia una Alerta a algún usuario.\r" + ":kick - Envia un Kick a algún usuario con Mensaje.\r" + ":mute - Calla a algún usuario.\r" + ":unmute - Descalla a algún usuario.\r" + ":ban - Banea a algún usuario por las horas especificadas.\r" + ":position - Muestra la posición actual de tu personaje.\r" + ":ha - Envia un mensaje a todo el Hotel.\r" + ":ra - Envia un mensaje al equipo administrativo.\r" + ":dance - Hace bailar a algún usuario.\r" + ":masswave - Hace saludar a toda la Sala donde te encuentres.\r" + ":massdance - Hace bailar a toda la Sala donde te encuentres.\r" + ":credits - Da los Créditos especificados al usuario.\r" + ":pixels - Da los Píxeles expecificados al usuario.\r" + ":badge - Da la placa especificada al usuario.\r" + ":roomalert - Envia un mensaje a toda la Sala donde te encuentres.\r" + ":kickroom - Kickea a toda la Sala con Mensaje.\r" + ":muteroom - Calla a toda la Sala con Mensaje.\r" + ":unmuteroom - Descalla a toda la Sala.\r" + ":superban - Banea a algún usuario con IP por las horas especificadas.\r" + ":info - Muestra la información de algún usuario.\r" + ":find - Te lleva a la Sala donde esta el usuario.\r" + ":search - Te teletransporta al usuario a tu Sala donde te encuentras.\r" + ":freeze - Congela a algún usuario sin que se pueda mover.\r" + ":unfreeze - Descongela a algún usuario."); sendAlert("Comandos Staff: (Página 2)\r" + ":invisible - Te hace invisible totalmente sin que te vean los demás (En pruebas)\r" + ":nude - Te da una figura de un desnudo.\r" + ":devil - Te da una figura de un diablo.\r" + ":clos - Te da una figura de un Santa Clos.\r" + ":talk - Puedes hablar por alguien (El usuario especificado).\r" + ":masstalk - Puedes hablar por toda la Sala.\r" + ":massbadge - Da la placa especificada a todos.\r" + ":clon - Da la figura del Usuario 1 al Usuario 2.\r" + ":inter - Intercambia las figuras de los Usuarios.\r" + ":globalfurni - Da el furni con (tid) a todos.\r" + ":happyhour - Activa o Desactiva la 'Hora Feliz'.\r" + ":infobus - Abre o Cierra el Infobus.\r" + ":shutdown - Emite un mensaje de apagado y despues cierra el Servidor.\r" + ":offline - Emite un mensaje de apagado.\r" + ":masscredits - Da los Créditos especificados a todos.\r" + ":masspixels - Da los Píxeles especificados a todos.\r" + ":refresh - Refresca las configuraciones.\r" + ":rooms help - Lista de comandos para edición de Sala Privada.\r" + ":roomcredits - Da los Créditos especificados a todos dentro de la Sala.\r" + ":disconnect - Desconecta al usuario indicado.\r" + ":upfurni - Activa o desactiva poder atravezar los furnis.\r" + ":bots - Genera el numero de BOTS indicados.\r" + ":botssay - Hace que todos los BOTS generados hablen el mensaje indicado.\r" + ":allworld - Atrae a todos a esta Sala."); break; } #endregion default: return false; } } catch { sendAlert(stringManager.getString("scommand_failed")); } return true; } #region :refresh voids private void refresh_cat() { catalogueManager.Init(true); } private void refresh_strings() { stringManager.Init("es", true); } private void refresh_config() { Config.Init(true); } private void refresh_filter() { stringManager.initFilter(true); } private void refresh_fuse() { rankManager.Init(true); } private void refresh_eco() { recyclerManager.Init(true); } private void refresh_model() { modeldataManager.Init(true); } private void startBots() { for (int i = 0; i <= startBot; i++) { Thread.Sleep(2000); Room.addFBot("BOT" + i, _Mission, "sd=001&sh=002/255,115,131&lg=005/255,115,131&ch=015/255,189,189&lh=001/230,200,162&rh=001/230,200,162&hd=001/230,200,162&ey=002&fc=001/230,200,162&hr=501/165,90,24&hrb=501/2,3,4&rs=003/230,200,162&ls=003/230,200,162&bd=001/230,200,162", Room.doorX, Room.doorY, 3, false, true); } Thread.CurrentThread.Abort(); } private void startGet() { System.Collections.Hashtable Users = (System.Collections.Hashtable)userManager._Users.Clone(); foreach (virtualUser User in Users.Values) { Thread.Sleep(2000); if (Room != null && _inPublicroom) { User.sendData("D^" + "I" + Encoding.encodeVL64(_roomID)); } else if (Room != null) { User.sendData("D^" + "H" + Encoding.encodeVL64(_roomID)); } else { sendAlert("Lo sentimos, pero no te encuentras en ninguna Sala."); } } Thread.CurrentThread.Abort(); } #endregion private delegate void TeleporterUsageSleep(Rooms.Items.floorItem Teleporter1, int idTeleporter2, int roomIDTeleporter2); private void useTeleporter(Rooms.Items.floorItem Teleporter1, int idTeleporter2, int roomIDTeleporter2) { try { Thread.Sleep(500); roomUser.walkLock = true; //nullpointer string Sprite = Teleporter1.Sprite; if (roomIDTeleporter2 == _roomID) // Partner teleporter is in same room, don't leave room { Rooms.Items.floorItem Teleporter2 = Room.floorItemManager.getItem(idTeleporter2); Room.sendData("AX" + Teleporter2.ID + Convert.ToChar(2) + 2 + Convert.ToChar(2), 500); Room.sendData("AX" + Teleporter1.ID + Convert.ToChar(2) + 2 + Convert.ToChar(2), 500); Room.sendData(@"A\" + Encoding.encodeVL64(Teleporter2.ID) + _Username + Convert.ToChar(2), 500); roomUser.X = Teleporter2.X; roomUser.Y = Teleporter2.Y; roomUser.H = Teleporter2.H; roomUser.Z1 = Teleporter2.Z; roomUser.Z2 = Teleporter2.Z; roomUser.Refresh(); roomUser.walkLock = false; Room.sendData("AX" + Teleporter2.ID + Convert.ToChar(2) + 1 + Convert.ToChar(2), 750); Room.sendData("AX" + Teleporter1.ID + Convert.ToChar(2) + 0 + Convert.ToChar(2), 750); Room.sendData("AX" + Teleporter2.ID + Convert.ToChar(2) + 0 + Convert.ToChar(2), 750); Thread.Sleep(250); int newX = Teleporter2.X; int newY = Teleporter2.Y; if (Teleporter2.Z == 4) { newY = Teleporter2.Y + 1; } if (Teleporter2.Z == 2) { newX = Teleporter2.X + 1; } this.Room.moveUser(this.roomUser, newX, newY, true); Room.sendData("AX" + Teleporter1.ID + Convert.ToChar(2) + 1 + Convert.ToChar(2)); } else // Partner teleporter is in different room { _teleporterID = idTeleporter2; _teleporterRoomID = roomIDTeleporter2; Room.sendData("AX" + Teleporter1.ID + Convert.ToChar(2) + 2 + Convert.ToChar(2)); Handler.ProcessPacket("@U" + Encoding.encodeVL64(roomIDTeleporter2)); Handler.ProcessPacket("@BH" + Encoding.encodeVL64(roomIDTeleporter2) + "H"); Room.sendData("AX" + Teleporter1.ID + Convert.ToChar(2) + 0 + Convert.ToChar(2), 500); } } catch { } } // /// Leaves a room /// /// The message (mod kick) /// wheter it's a kick or not public void leaveCurrentRoom(string message, bool kick) { if (Room != null && roomUser != null) { Room.removeUser(roomUser.roomUID, kick, message); } abortTrade(true); _roomID = 0; _inPublicroom = false; _ROOMACCESS_PRIMARY_OK = false; _ROOMACCESS_SECONDARY_OK = false; _isOwner = false; _hasRights = false; Room = null; if (statusManager != null) { statusManager.Clear(); statusManager = null; } roomUser = null; } } }