/// <summary> /// Unloads the room. /// </summary> /// <param name="room">The room.</param> /// <param name="reason">The reason.</param> internal void UnloadRoom(Room room, string reason) { if (room?.RoomData == null || room.Disposed) return; room.Disposed = true; if (AzureEmulator.GetGame().GetNavigator().PrivateCategories.Contains(room.RoomData.Category))((FlatCat) AzureEmulator.GetGame().GetNavigator().PrivateCategories[room.RoomData.Category]).UsersNow -= room.UserCount; room.RoomData.UsersNow = 0; string state = "open"; if (room.RoomData.State == 1) state = "locked"; else if (room.RoomData.State > 1) state = "password"; uint roomId = room.RoomId; try { using (IQueryAdapter queryReactor = AzureEmulator.GetDatabaseManager().GetQueryReactor()) { queryReactor.SetQuery("UPDATE rooms_data SET caption = @caption, description = @description, password = @password, category = " + room.RoomData.Category + ", state = '" + state + "', tags = @tags, users_now = '0', users_max = " + room.RoomData.UsersMax + ", allow_pets = '" + AzureEmulator.BoolToEnum(room.RoomData.AllowPets) + "', allow_pets_eat = '" + AzureEmulator.BoolToEnum(room.RoomData.AllowPetsEating) + "', allow_walkthrough = '" + AzureEmulator.BoolToEnum(room.RoomData.AllowWalkThrough) + "', hidewall = '" + AzureEmulator.BoolToEnum(room.RoomData.HideWall) + "', floorthick = " + room.RoomData.FloorThickness + ", wallthick = " + room.RoomData.WallThickness + ", mute_settings='" + room.RoomData.WhoCanMute + "', kick_settings='" + room.RoomData.WhoCanKick + "',ban_settings='" + room.RoomData.WhoCanBan + "', walls_height = '" + room.RoomData.WallHeight + "', chat_type = @chat_t,chat_balloon = @chat_b,chat_speed = @chat_s,chat_max_distance = @chat_m,chat_flood_protection = @chat_f, trade_state = '" + room.RoomData.TradeState + "' WHERE id = " + roomId); queryReactor.AddParameter("caption", room.RoomData.Name); queryReactor.AddParameter("description", room.RoomData.Description); queryReactor.AddParameter("password", room.RoomData.PassWord); queryReactor.AddParameter("tags", string.Join(",", room.RoomData.Tags)); queryReactor.AddParameter("chat_t", room.RoomData.ChatType); queryReactor.AddParameter("chat_b", room.RoomData.ChatBalloon); queryReactor.AddParameter("chat_s", room.RoomData.ChatSpeed); queryReactor.AddParameter("chat_m", room.RoomData.ChatMaxDistance); queryReactor.AddParameter("chat_f", room.RoomData.ChatFloodProtection); queryReactor.RunQuery(); if (room.GetRoomUserManager() != null && room.GetRoomUserManager().UserList != null) { foreach (RoomUser current in room.GetRoomUserManager().UserList.Values) { if (current == null) continue; if (current.IsPet) { if (current.PetData == null) continue; queryReactor.SetQuery("UPDATE bots SET x=@x, y=@y, z=@z WHERE id=@id LIMIT 1"); queryReactor.AddParameter("x", current.X); queryReactor.AddParameter("y", current.Y); queryReactor.AddParameter("z", current.Z); queryReactor.AddParameter("id", current.PetData.PetId); queryReactor.RunQuery(); current.BotAI?.Dispose(); } else if (current.IsBot) { if (current.BotData == null) continue; queryReactor.SetQuery("UPDATE bots SET x=@x, y=@y, z=@z, name=@name, motto=@motto, look=@look, rotation=@rotation, dance=@dance WHERE id=@id LIMIT 1"); queryReactor.AddParameter("name", current.BotData.Name); queryReactor.AddParameter("motto", current.BotData.Motto); queryReactor.AddParameter("look", current.BotData.Look); queryReactor.AddParameter("rotation", current.BotData.Rot); queryReactor.AddParameter("dance", current.BotData.DanceId); queryReactor.AddParameter("x", current.X); queryReactor.AddParameter("y", current.Y); queryReactor.AddParameter("z", current.Z); queryReactor.AddParameter("id", current.BotData.BotId); queryReactor.RunQuery(); current.BotAI?.Dispose(); } else { if (current.GetClient() == null) continue; room.GetRoomUserManager().RemoveUserFromRoom(current.GetClient(), true, false); current.GetClient().CurrentRoomUserId = -1; } } } Room junkRoom; LoadedRooms.TryRemove(room.RoomId, out junkRoom); junkRoom = null; Out.WriteLine(string.Format("Room #{0} was unloaded, reason: " + reason, room.RoomId), "Azure.Room.Manager", ConsoleColor.DarkGray); room.Destroy(); } } catch (Exception e) { Writer.Writer.LogException(e.ToString()); } }
internal void PlantMonsterplant(RoomItem mopla, Room room) { int rarity = 0, internalRarity = 0; if (room == null || mopla == null) return; if ((mopla.GetBaseItem().InteractionType != Interaction.Moplaseed) && (mopla.GetBaseItem().InteractionType != Interaction.RareMoplaSeed)) return; if (string.IsNullOrEmpty(mopla.ExtraData) || mopla.ExtraData == "0") rarity = 1; if (!string.IsNullOrEmpty(mopla.ExtraData) && mopla.ExtraData != "0") rarity = int.TryParse(mopla.ExtraData, out internalRarity) ? internalRarity : 1; var getX = mopla.X; var getY = mopla.Y; room.GetRoomItemHandler().RemoveFurniture(Session, mopla.Id, false); var pet = CatalogManager.CreatePet(Session.GetHabbo().Id, "Monsterplant", 16, "0", "0", rarity); Response.Init(LibraryParser.OutgoingRequest("SendMonsterplantIdMessageComposer")); Response.AppendInteger(pet.PetId); SendResponse(); using (var queryReactor = Azure.GetDatabaseManager().GetQueryReactor()) queryReactor.RunFastQuery(string.Concat("UPDATE bots SET room_id = '", room.RoomId, "', x = '", getX, "', y = '", getY, "' WHERE id = '", pet.PetId, "'")); pet.PlacedInRoom = true; pet.RoomId = room.RoomId; var bot = new RoomBot(pet.PetId, pet.OwnerId, pet.RoomId, AiType.Pet, "freeroam", pet.Name, "", pet.Look, getX, getY, 0.0, 4, 0, 0, 0, 0, null, null, "", 0, false); room.GetRoomUserManager().DeployBot(bot, pet); if (pet.DbState != DatabaseUpdateState.NeedsInsert) pet.DbState = DatabaseUpdateState.NeedsUpdate; using (var queryreactor2 = Azure.GetDatabaseManager().GetQueryReactor()) { queryreactor2.RunFastQuery(string.Format("DELETE FROM items_rooms WHERE id = {0}", mopla.Id)); room.GetRoomUserManager().SavePets(queryreactor2); } }