public void ChangeBattlePetQuality(ObjectGuid guid, BattlePetBreedQuality quality) { if (!HasJournalLock()) { return; } BattlePet pet = GetPet(guid); if (pet == null) { return; } if (quality > BattlePetBreedQuality.Rare) { return; } var battlePetSpecies = CliDB.BattlePetSpeciesStorage.LookupByKey(pet.PacketInfo.Species); if (battlePetSpecies != null) { if (battlePetSpecies.GetFlags().HasFlag(BattlePetSpeciesFlags.CantBattle)) { return; } } byte qualityValue = (byte)quality; if (pet.PacketInfo.Quality >= qualityValue) { return; } pet.PacketInfo.Quality = qualityValue; pet.CalculateStats(); pet.PacketInfo.Health = pet.PacketInfo.MaxHealth; if (pet.SaveInfo != BattlePetSaveInfo.New) { pet.SaveInfo = BattlePetSaveInfo.Changed; } List <BattlePet> updates = new(); updates.Add(pet); SendUpdates(updates, false); // UF::PlayerData::CurrentBattlePetBreedQuality isn't updated (Intended) // _owner.GetPlayer().SetCurrentBattlePetBreedQuality(qualityValue); }
public void AddPet(uint species, uint display, ushort breed, BattlePetBreedQuality quality, ushort level = 1) { BattlePetSpeciesRecord battlePetSpecies = CliDB.BattlePetSpeciesStorage.LookupByKey(species); if (battlePetSpecies == null) // should never happen { return; } if (!battlePetSpecies.GetFlags().HasFlag(BattlePetSpeciesFlags.WellKnown)) // Not learnable { return; } BattlePet pet = new(); pet.PacketInfo.Guid = ObjectGuid.Create(HighGuid.BattlePet, Global.ObjectMgr.GetGenerator(HighGuid.BattlePet).Generate()); pet.PacketInfo.Species = species; pet.PacketInfo.CreatureID = battlePetSpecies.CreatureID; pet.PacketInfo.DisplayID = display; pet.PacketInfo.Level = level; pet.PacketInfo.Exp = 0; pet.PacketInfo.Flags = 0; pet.PacketInfo.Breed = breed; pet.PacketInfo.Quality = (byte)quality; pet.PacketInfo.Name = ""; pet.CalculateStats(); pet.PacketInfo.Health = pet.PacketInfo.MaxHealth; Player player = _owner.GetPlayer(); if (battlePetSpecies.GetFlags().HasFlag(BattlePetSpeciesFlags.NotAccountWide)) { pet.PacketInfo.OwnerInfo.Value = new(); pet.PacketInfo.OwnerInfo.Value.Guid = player.GetGUID(); pet.PacketInfo.OwnerInfo.Value.PlayerVirtualRealm = Global.WorldMgr.GetVirtualRealmAddress(); pet.PacketInfo.OwnerInfo.Value.PlayerNativeRealm = Global.WorldMgr.GetVirtualRealmAddress(); } pet.SaveInfo = BattlePetSaveInfo.New; _pets[pet.PacketInfo.Guid.GetCounter()] = pet; List <BattlePet> updates = new(); updates.Add(pet); SendUpdates(updates, true); player.UpdateCriteria(CriteriaType.UniquePetsOwned); player.UpdateCriteria(CriteriaType.LearnedNewPet, species); }
static void LoadDefaultPetQualities() { SQLResult result = DB.World.Query("SELECT speciesId, quality FROM battle_pet_quality"); if (result.IsEmpty()) { Log.outInfo(LogFilter.ServerLoading, "Loaded 0 battle pet qualities. DB table `battle_pet_quality` is empty."); return; } do { uint speciesId = result.Read <uint>(0); BattlePetBreedQuality quality = (BattlePetBreedQuality)result.Read <byte>(1); var battlePetSpecies = CliDB.BattlePetSpeciesStorage.LookupByKey(speciesId); if (battlePetSpecies == null) { Log.outError(LogFilter.Sql, $"Non-existing BattlePetSpecies.db2 entry {speciesId} was referenced in `battle_pet_quality` by row ({speciesId}, {quality})."); continue; } if (quality >= BattlePetBreedQuality.Max) { Log.outError(LogFilter.Sql, $"BattlePetSpecies.db2 entry {speciesId} was referenced in `battle_pet_quality` with non-existing quality {quality})."); continue; } if (battlePetSpecies.GetFlags().HasFlag(BattlePetSpeciesFlags.WellKnown) && quality > BattlePetBreedQuality.Rare) { Log.outError(LogFilter.Sql, $"Learnable BattlePetSpecies.db2 entry {speciesId} was referenced in `battle_pet_quality` with invalid quality {quality}. Maximum allowed quality is BattlePetBreedQuality::Rare."); continue; } _defaultQualityPerSpecies[speciesId] = quality; } while (result.NextRow()); Log.outInfo(LogFilter.ServerLoading, "Loaded {0} battle pet qualities.", _defaultQualityPerSpecies.Count); }