public bool Execute(params object[] stuff) { if (!Items.Any()) { return(true); } bool useExtradata, useRot, usePos; Dictionary <uint, string[]> itemsOriginalData; try { if (string.IsNullOrWhiteSpace(OtherString) || !OtherString.Contains(",") || !OtherExtraString.Contains("|")) { return(false); } string[] booleans = OtherString.ToLower().Split(','); useExtradata = booleans[0] == "true"; useRot = booleans[1] == "true"; usePos = booleans[2] == "true"; itemsOriginalData = OtherExtraString.Split('/') .Select(data => data.Split('|')) .ToDictionary(array => uint.Parse(array[0]), array => array.Skip(1).ToArray()); } catch (Exception e) { ServerLogManager.LogException(e.ToString()); return(false); } foreach (RoomItem current in Items) { if (current == null || !itemsOriginalData.ContainsKey(current.Id)) { return(false); } string[] originalData = itemsOriginalData[current.Id]; if (useRot) { if (current.Rot != int.Parse(originalData[1])) { return(true); } } if (useExtradata) { if (current.ExtraData == string.Empty) { current.ExtraData = "0"; } if (current.ExtraData != (originalData[0] == string.Empty ? "0" : originalData[0])) { return(true); } } if (!usePos) { continue; } string[] originalPos = originalData[2].Split(','); if ((current.X != int.Parse(originalPos[0])) && (current.Y != int.Parse(originalPos[1]))) { return(true); } } return(false); }
/// <summary> /// Handles the packet data. /// </summary> /// <param name="data">The data.</param> /// <param name="length">The length.</param> public void HandlePacketData(byte[] data, int length) { if (length > 0 && _currentClient != null) { short messageId = 0; try { int pos; for (pos = 0; pos < length;) { if (_currentPacketLength == -1) { if (length < IntSize) { BufferCopy(data, length); break; } _currentPacketLength = HabboEncoding.DecodeInt32(data, ref pos); } if (_currentPacketLength < 2 || _currentPacketLength > 4096) { _currentPacketLength = -1; break; } if (_currentPacketLength == length - pos + _bufferPos) { if (_bufferPos != 0) { BufferCopy(data, length, pos); pos = 0; messageId = HabboEncoding.DecodeInt16(_bufferedData, ref pos); HandleMessage(messageId, _bufferedData, 2, _currentPacketLength); } else { messageId = HabboEncoding.DecodeInt16(data, ref pos); HandleMessage(messageId, data, pos, _currentPacketLength); } pos = length; _currentPacketLength = -1; } else { int remainder = length - pos - (_currentPacketLength - _bufferPos); if (_bufferPos != 0) { int toCopy = remainder - _bufferPos; BufferCopy(data, toCopy, pos); int zero = 0; messageId = HabboEncoding.DecodeInt16(_bufferedData, ref zero); HandleMessage(messageId, _bufferedData, 2, _currentPacketLength); } else { messageId = HabboEncoding.DecodeInt16(data, ref pos); HandleMessage(messageId, data, pos, _currentPacketLength); // ReSharper disable once RedundantAssignment pos -= 2; } _currentPacketLength = -1; pos = length - remainder; } } } catch (Exception exception) { ServerLogManager.HandleException(exception, $"packet handling ----> {messageId}"); } } }
/// <summary> /// Invokes the command. /// </summary> /// <param name="inputData">The input data.</param> internal static void InvokeCommand(string inputData) { if (string.IsNullOrEmpty(inputData) && ServerLogManager.DisabledState) { return; } Console.WriteLine(); try { if (inputData == null) { return; } string[] strArray = inputData.Split(' '); switch (strArray[0]) { case "shutdown": case "close": ServerLogManager.DisablePrimaryWriting(true); Writer.WriteLine("Shutdown Initalized", "Yupi.Life", ConsoleColor.DarkYellow); Yupi.PerformShutDown(false); Console.WriteLine(); break; case "restart": ServerLogManager.LogMessage($"Server Restarting at {DateTime.Now}"); ServerLogManager.DisablePrimaryWriting(true); Writer.WriteLine("Restart Initialized", "Yupi.Life", ConsoleColor.DarkYellow); Yupi.PerformShutDown(true); Console.WriteLine(); break; case "flush": case "reload": if (strArray.Length >= 2) { break; } Console.WriteLine("Please specify parameter. Type 'help' to know more about Console Commands"); Console.WriteLine(); break; case "alert": { string str = inputData.Substring(6); ServerMessage message = new ServerMessage(LibraryParser.OutgoingRequest("BroadcastNotifMessageComposer")); message.AppendString(str); message.AppendString(string.Empty); GetGame().GetClientManager().QueueBroadcaseMessage(message); Console.WriteLine("[{0}] was sent!", str); return; } case "clear": Console.Clear(); break; case "status": TimeSpan uptime = DateTime.Now - Yupi.ServerStarted; Console.WriteLine("Server status:"); Console.WriteLine(); Console.WriteLine("Uptime:"); Console.WriteLine("\tDays: {0}", uptime.Days); Console.WriteLine("\tHours: {0}", uptime.Hours); Console.WriteLine("\tMinutes: {0}", uptime.Minutes); Console.WriteLine(); Console.WriteLine("Stats:"); Console.WriteLine("\tAccepted Connections: {0}", Yupi.GetConnectionManager().Manager.AcceptedConnections); Console.WriteLine("\tActive Threads: {0}", Process.GetCurrentProcess().Threads.Count); Console.WriteLine(); Console.WriteLine(); break; case "gcinfo": { Console.WriteLine("Mode: " + GCSettings.LatencyMode); Console.WriteLine("Is server GC: " + GCSettings.IsServerGC); break; } case "memstat": { Console.WriteLine("GC status:"); Console.WriteLine("\tGeneration supported: " + GC.MaxGeneration); Console.WriteLine("\tLatency mode: " + GCSettings.LatencyMode); Console.WriteLine("\tIs server GC: " + GCSettings.IsServerGC); Console.WriteLine(); break; } case "memory": { GC.Collect(); Console.WriteLine("Memory flushed"); break; } case "help": Console.WriteLine("shutdown/close - for safe shutting down Yupi"); Console.WriteLine("clear - Clear all text"); Console.WriteLine("memory - Call gargabe collector"); Console.WriteLine("alert (msg) - send alert to Every1!"); Console.WriteLine("flush/reload"); Console.WriteLine(" - catalog"); Console.WriteLine(" - modeldata"); Console.WriteLine(" - bans"); Console.WriteLine(" - packets (reload packets ids)"); Console.WriteLine(" - filter"); Console.WriteLine(); break; default: UnknownCommand(inputData); break; } switch (strArray[1]) { case "database": Console.WriteLine("Database destroyed"); Console.WriteLine(); break; case "packets": LibraryParser.ReloadDictionarys(); Console.WriteLine("> Packets Reloaded Suceffuly..."); Console.WriteLine(); break; case "catalog": case "shop": case "catalogus": FurnitureDataManager.SetCache(); using (IQueryAdapter adapter = Yupi.GetDatabaseManager().GetQueryReactor()) GetGame().GetCatalog().Initialize(adapter); FurnitureDataManager.Clear(); GetGame() .GetClientManager() .QueueBroadcaseMessage( new ServerMessage(LibraryParser.OutgoingRequest("PublishShopMessageComposer"))); Console.WriteLine("Catalogue was re-loaded."); Console.WriteLine(); break; case "modeldata": using (IQueryAdapter adapter2 = Yupi.GetDatabaseManager().GetQueryReactor()) GetGame().GetRoomManager().LoadModels(adapter2); Console.WriteLine("Room models were re-loaded."); Console.WriteLine(); break; case "bans": using (IQueryAdapter adapter3 = Yupi.GetDatabaseManager().GetQueryReactor()) GetGame().GetBanManager().LoadBans(adapter3); Console.WriteLine("Bans were re-loaded"); Console.WriteLine(); break; case "filter": UserChatInputFilter.Reload(); BlackWordsManager.Reload(); break; default: UnknownCommand(inputData); Console.WriteLine(); break; } } catch (Exception) { // ignored } }
/// <summary> /// Called when [timer tick]. /// </summary> internal override void OnTimerTick() { if (_speechTimer <= 0) { RoomUser roomUser = GetRoomUser(); if (roomUser != null) { if (roomUser.PetData.DbState != DatabaseUpdateState.NeedsInsert) { roomUser.PetData.DbState = DatabaseUpdateState.NeedsUpdate; } Random random = new Random(); RemovePetStatus(); string[] value = PetLocale.GetValue($"speech.pet{roomUser.PetData.Type}"); string text = value[random.Next(0, value.Length - 1)]; if (GetRoom() != null && !GetRoom().MutedPets) { roomUser.Chat(null, text, false, 0); } else { roomUser.Statusses.Add(text, ServerUserChatTextHandler.GetString(roomUser.Z)); } } _speechTimer = Yupi.GetRandomNumber(20, 120); } else { _speechTimer--; } if (_actionTimer <= 0 && GetRoomUser() != null) { try { _actionTimer = GetRoomUser().FollowingOwner != null ? 2 : Yupi.GetRandomNumber(15, 40 + GetRoomUser().PetData.VirtualId); RemovePetStatus(); _actionTimer = Yupi.GetRandomNumber(15, 40 + GetRoomUser().PetData.VirtualId); if (GetRoomUser().RidingHorse != true) { RemovePetStatus(); if (GetRoomUser().FollowingOwner != null) { GetRoomUser().MoveTo(GetRoomUser().FollowingOwner.SquareBehind); } else { if (GetRoomUser().PetData.Type == 16) { return; //Monsterplants can't move } Point nextCoord = GetRoom().GetGameMap().GetRandomValidWalkableSquare(); GetRoomUser().MoveTo(nextCoord.X, nextCoord.Y); } } if (new Random().Next(2, 15) % 2 == 0) { if (GetRoomUser().PetData.Type == 16) { MoplaBreed breed = GetRoomUser().PetData.MoplaBreed; GetRoomUser().PetData.Energy--; GetRoomUser().AddStatus("gst", breed.LiveState == MoplaState.Dead ? "sad" : "sml"); GetRoomUser() .PetData.MoplaBreed.OnTimerTick(GetRoomUser().PetData.LastHealth, GetRoomUser().PetData.UntilGrown); } else { if (GetRoomUser().PetData.Energy < 30) { GetRoomUser().AddStatus("lay", ""); } else { GetRoomUser().AddStatus("gst", "joy"); if (new Random().Next(1, 7) == 3) { GetRoomUser().AddStatus("snf", ""); } } } GetRoomUser().UpdateNeeded = true; } goto IL_1B5; } catch (Exception pException) { ServerLogManager.HandleException(pException, "PetBot.OnTimerTick"); goto IL_1B5; } } _actionTimer--; IL_1B5: if (_energyTimer <= 0) { RemovePetStatus(); RoomUser roomUser2 = GetRoomUser(); roomUser2?.PetData.PetEnergy(true); _energyTimer = Yupi.GetRandomNumber(30, 120); return; } _energyTimer--; }
internal override void OnChatTick() { if (GetBotData() == null || GetRoomUser() == null || GetBotData().WasPicked || GetBotData().RandomSpeech == null || !GetBotData().RandomSpeech.Any()) { StopTimerTick(); return; } if (GetRoom() != null && GetRoom().MutedBots) { return; } string randomSpeech = GetBotData().GetRandomSpeech(GetBotData().MixPhrases); try { switch (randomSpeech) { case ":sit": { RoomUser user = GetRoomUser(); if (user.RotBody % 2 != 0) { user.RotBody--; } user.Z = GetRoom().GetGameMap().SqAbsoluteHeight(user.X, user.Y); if (!user.Statusses.ContainsKey("sit")) { user.UpdateNeeded = true; user.Statusses.Add("sit", "0.55"); } user.IsSitting = true; return; } case ":stand": { RoomUser user = GetRoomUser(); if (user.IsSitting) { user.Statusses.Remove("sit"); user.IsSitting = false; user.UpdateNeeded = true; } else if (user.IsLyingDown) { user.Statusses.Remove("lay"); user.IsLyingDown = false; user.UpdateNeeded = true; } return; } } if (GetRoom() != null) { randomSpeech = randomSpeech.Replace("%user_count%", GetRoom().GetRoomUserManager().GetRoomUserCount().ToString()); randomSpeech = randomSpeech.Replace("%item_count%", GetRoom().GetRoomItemHandler().TotalItems.ToString()); randomSpeech = randomSpeech.Replace("%floor_item_count%", GetRoom().GetRoomItemHandler().FloorItems.Keys.Count.ToString()); randomSpeech = randomSpeech.Replace("%wall_item_count%", GetRoom().GetRoomItemHandler().WallItems.Keys.Count.ToString()); if (GetRoom().RoomData != null) { randomSpeech = randomSpeech.Replace("%roomname%", GetRoom().RoomData.Name); randomSpeech = randomSpeech.Replace("%owner%", GetRoom().RoomData.Owner); } } if (GetBotData() != null) { randomSpeech = randomSpeech.Replace("%name%", GetBotData().Name); } GetRoomUser().Chat(null, randomSpeech, false, 0); } catch (Exception e) { ServerLogManager.LogException(e.ToString()); } }
/// <summary> /// Runs the database update. /// </summary> internal void RunDbUpdate() { try { if (_mRemovedItems.Count <= 0 && _mAddedItems.Count <= 0 && _inventoryPets.Count <= 0) { return; } DatabaseQueryChunk queryChunk = new DatabaseQueryChunk(); if (_mAddedItems.Count > 0) { foreach (UserItem userItem in _mAddedItems.Values) { queryChunk.AddQuery($"UPDATE items_rooms SET user_id='{UserId}', room_id='0' WHERE id='{userItem.Id}'"); } _mAddedItems.Clear(); } if (_mRemovedItems.Count > 0) { try { foreach (UserItem userItem2 in _mRemovedItems.Values) { using (IQueryAdapter queryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) GetClient().GetHabbo().CurrentRoom.GetRoomItemHandler().SaveFurniture(queryReactor); if (SongDisks.Contains(userItem2.Id)) { SongDisks.Remove(userItem2.Id); } } } catch { // ignored } _mRemovedItems.Clear(); } foreach (Pet current in _inventoryPets.Values) { if (current.DbState == DatabaseUpdateState.NeedsUpdate) { queryChunk.AddParameter($"{current.PetId}name", current.Name); queryChunk.AddParameter($"{current.PetId}race", current.Race); queryChunk.AddParameter($"{current.PetId}color", current.Color); queryChunk.AddQuery(string.Concat("UPDATE bots_data SET room_id = ", current.RoomId, ", name = @", current.PetId, "name, x = ", current.X, ", Y = ", current.Y, ", Z = ", current.Z, " WHERE id = ", current.PetId)); queryChunk.AddQuery(string.Concat("UPDATE pets_data SET race = @", current.PetId, "race, color = @", current.PetId, "color, type = ", current.Type, ", experience = ", current.Experience, ", energy = ", current.Energy, ", nutrition = ", current.Nutrition, ", respect = ", current.Respect, ", createstamp = '", current.CreationStamp, "', lasthealth_stamp = ", Yupi.DateTimeToUnix(current.LastHealth), ", untilgrown_stamp = ", Yupi.DateTimeToUnix(current.UntilGrown), " WHERE id = ", current.PetId)); } current.DbState = DatabaseUpdateState.Updated; } using (IQueryAdapter queryreactor2 = Yupi.GetDatabaseManager().GetQueryReactor()) queryChunk.Execute(queryreactor2); } catch (Exception ex) { ServerLogManager.LogCacheError($"FATAL ERROR DURING USER INVENTORY DB UPDATE: {ex}"); } }
/// <summary> /// Tries the login. /// </summary> /// <param name="authTicket">The authentication ticket.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> internal bool TryLogin(string authTicket) { try { string ip = GetConnection().GetIp(); uint errorCode; UserData userData = UserDataFactory.GetUserData(authTicket, out errorCode); if (errorCode == 1 || errorCode == 2) { return(false); } Yupi.GetGame().GetClientManager().RegisterClient(this, userData.UserId, userData.User.UserName); _habbo = userData.User; userData.User.LoadData(userData); string banReason = Yupi.GetGame().GetBanManager().GetBanReason(userData.User.UserName, ip, MachineId); if (!string.IsNullOrEmpty(banReason) || userData.User.UserName == null) { SendNotifWithScroll(banReason); using (IQueryAdapter commitableQueryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) { commitableQueryReactor.SetQuery($"SELECT ip_last FROM users WHERE id={GetHabbo().Id} LIMIT 1"); string supaString = commitableQueryReactor.GetString(); commitableQueryReactor.SetQuery( $"SELECT COUNT(0) FROM users_bans_access WHERE user_id={_habbo.Id} LIMIT 1"); int integer = commitableQueryReactor.GetInteger(); if (integer > 0) { commitableQueryReactor.RunFastQuery( "UPDATE users_bans_access SET attempts = attempts + 1, ip='" + supaString + "' WHERE user_id=" + GetHabbo().Id + " LIMIT 1"); } else { commitableQueryReactor.RunFastQuery("INSERT INTO users_bans_access (user_id, ip) VALUES (" + GetHabbo().Id + ", '" + supaString + "')"); } } return(false); } using (IQueryAdapter commitableQueryReactor = Yupi.GetDatabaseManager().GetQueryReactor()) commitableQueryReactor.RunFastQuery($"UPDATE users SET ip_last='{ip}' WHERE id={GetHabbo().Id}"); userData.User.Init(this, userData); QueuedServerMessage queuedServerMessage = new QueuedServerMessage(_connection); ServerMessage serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("UniqueMachineIDMessageComposer")); serverMessage.AppendString(MachineId); queuedServerMessage.AppendResponse(serverMessage); queuedServerMessage.AppendResponse( new ServerMessage(LibraryParser.OutgoingRequest("AuthenticationOKMessageComposer"))); ServerMessage serverMessage2 = new ServerMessage(LibraryParser.OutgoingRequest("HomeRoomMessageComposer")); serverMessage2.AppendInteger(_habbo.HomeRoom); serverMessage2.AppendInteger(_habbo.HomeRoom); queuedServerMessage.AppendResponse(serverMessage2); serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("MinimailCountMessageComposer")); serverMessage.AppendInteger(_habbo.MinimailUnreadMessages); queuedServerMessage.AppendResponse(serverMessage); serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("FavouriteRoomsMessageComposer")); serverMessage.AppendInteger(30); if (userData.User.FavoriteRooms == null || !userData.User.FavoriteRooms.Any()) { serverMessage.AppendInteger(0); } else { serverMessage.AppendInteger(userData.User.FavoriteRooms.Count); foreach (uint i in userData.User.FavoriteRooms) { serverMessage.AppendInteger(i); } } queuedServerMessage.AppendResponse(serverMessage); ServerMessage rightsMessage = new ServerMessage(LibraryParser.OutgoingRequest("UserClubRightsMessageComposer")); rightsMessage.AppendInteger(userData.User.GetSubscriptionManager().HasSubscription ? 2 : 0); rightsMessage.AppendInteger(userData.User.Rank); rightsMessage.AppendInteger(0); queuedServerMessage.AppendResponse(rightsMessage); serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("EnableNotificationsMessageComposer")); serverMessage.AppendBool(true); //isOpen serverMessage.AppendBool(false); queuedServerMessage.AppendResponse(serverMessage); serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("EnableTradingMessageComposer")); serverMessage.AppendBool(true); queuedServerMessage.AppendResponse(serverMessage); userData.User.UpdateCreditsBalance(); serverMessage = new ServerMessage(LibraryParser.OutgoingRequest("ActivityPointsMessageComposer")); serverMessage.AppendInteger(2); serverMessage.AppendInteger(0); serverMessage.AppendInteger(userData.User.Duckets); serverMessage.AppendInteger(5); serverMessage.AppendInteger(userData.User.Diamonds); queuedServerMessage.AppendResponse(serverMessage); if (userData.User.HasFuse("fuse_mod")) { queuedServerMessage.AppendResponse(Yupi.GetGame().GetModerationTool().SerializeTool(this)); } queuedServerMessage.AppendResponse(Yupi.GetGame().GetAchievementManager().AchievementDataCached); queuedServerMessage.AppendResponse(GetHabbo().GetAvatarEffectsInventoryComponent().GetPacket()); queuedServerMessage.SendResponse(); Yupi.GetGame().GetAchievementManager().TryProgressHabboClubAchievements(this); Yupi.GetGame().GetAchievementManager().TryProgressRegistrationAchievements(this); Yupi.GetGame().GetAchievementManager().TryProgressLoginAchievements(this); return(true); } catch (Exception ex) { ServerLogManager.LogCriticalException($"Bug during user login: {ex}"); } return(false); }