Core/Spells: Implemented battle pet experience related spell effects and auras

Port From (https://github.com/TrinityCore/TrinityCore/commit/9354b4ac8ec63f0b2ee5ceb3c8b6a3c6a75bd99f)
This commit is contained in:
hondacrx
2022-02-17 10:40:20 -05:00
parent 9db44e3a21
commit bd80047a09
7 changed files with 121 additions and 5 deletions
@@ -637,9 +637,9 @@ namespace Framework.Constants
AccountObtainPetThroughBattle = 157, /*NYI*/ // (Account Only) Obtain a pet through battle
WinPetBattle = 158, /*NYI*/ // Win a pet battle
LosePetBattle = 159, /*NYI*/ // Lose a pet battle
BattlePetReachLevel = 160, /*NYI*/ // (Account Only) Battle pet has reached level {#Level}
BattlePetReachLevel = 160, // (Account Only) Battle pet has reached level {#Level}
PlayerObtainPetThroughBattle = 161, /*NYI*/ // (Player) Obtain a pet through battle
ActivelyEarnPetLevel = 162, /*NYI*/ // (Player) Actively earn level {#Level} with a pet by a player
ActivelyEarnPetLevel = 162, // (Player) Actively earn level {#Level} with a pet by a player
EnterArea = 163, /*NYI*/ // Enter Map Area "{AreaTable}"
LeaveArea = 164, /*NYI*/ // Leave Map Area "{AreaTable}"
DefeatDungeonEncounter = 165, /*NYI*/ // Defeat Encounter "{DungeonEncounter}"
@@ -77,4 +77,12 @@ namespace Framework.Constants
Max
}
public enum BattlePetXpSource
{
PetBattle = 0,
SpellEffect = 1,
Count
}
}
+9 -2
View File
@@ -137,6 +137,8 @@ namespace Game.Achievements
case CriteriaType.PVPKillInArea:
case CriteriaType.WinArena: // This also behaves like CriteriaType.WinAnyRankedArena
case CriteriaType.Login:
case CriteriaType.BattlePetReachLevel:
case CriteriaType.ActivelyEarnPetLevel:
case CriteriaType.PlaceGarrisonBuilding:
case CriteriaType.ActivateAnyGarrisonBuilding:
case CriteriaType.HonorLevelIncrease:
@@ -389,9 +391,7 @@ namespace Game.Achievements
case CriteriaType.CompleteScenario:
case CriteriaType.AccountObtainPetThroughBattle:
case CriteriaType.WinPetBattle:
case CriteriaType.BattlePetReachLevel:
case CriteriaType.PlayerObtainPetThroughBattle:
case CriteriaType.ActivelyEarnPetLevel:
case CriteriaType.EnterArea:
case CriteriaType.LeaveArea:
case CriteriaType.DefeatDungeonEncounter:
@@ -812,6 +812,8 @@ namespace Game.Achievements
case CriteriaType.CurrencyGained:
case CriteriaType.PlaceGarrisonBuilding:
case CriteriaType.UniquePetsOwned:
case CriteriaType.BattlePetReachLevel:
case CriteriaType.ActivelyEarnPetLevel:
case CriteriaType.LearnAnyTransmogInSlot:
case CriteriaType.ParagonLevelIncreaseWithFaction:
case CriteriaType.PlayerHasEarnedHonor:
@@ -1207,6 +1209,11 @@ namespace Game.Achievements
if (miscValue1 != criteria.Entry.Asset)
return false;
break;
case CriteriaType.BattlePetReachLevel:
case CriteriaType.ActivelyEarnPetLevel:
if (miscValue1 == 0 || miscValue2 == 0 || miscValue2 != criteria.Entry.Asset)
return false;
break;
case CriteriaType.ActivelyReachLevel:
if (miscValue1 == 0 || miscValue1 != criteria.Entry.Asset)
return false;
+73 -1
View File
@@ -625,7 +625,79 @@ namespace Game.BattlePets
SendUpdates(updates, false);
// UF::PlayerData::CurrentBattlePetBreedQuality isn't updated (Intended)
// _owner->GetPlayer()->SetCurrentBattlePetBreedQuality(qualityValue);
// _owner.GetPlayer().SetCurrentBattlePetBreedQuality(qualityValue);
}
public void GrantBattlePetExperience(ObjectGuid guid, ushort xp, BattlePetXpSource xpSource)
{
if (!HasJournalLock())
return;
BattlePet pet = GetPet(guid);
if (pet == null)
return;
if (xp <= 0 || xpSource >= BattlePetXpSource.Count)
return;
var battlePetSpecies = CliDB.BattlePetSpeciesStorage.LookupByKey(pet.PacketInfo.Species);
if (battlePetSpecies != null)
if (battlePetSpecies.GetFlags().HasFlag(BattlePetSpeciesFlags.CantBattle))
return;
ushort level = pet.PacketInfo.Level;
if (level >= SharedConst.MaxBattlePetLevel)
return;
var xpEntry = CliDB.BattlePetXPGameTable.GetRow(level);
if (xpEntry == null)
return;
Player player = _owner.GetPlayer();
ushort nextLevelXp = (ushort)CliDB.GetBattlePetXPPerLevel(xpEntry);
if (xpSource == BattlePetXpSource.PetBattle)
xp = (ushort)(xp * player.GetTotalAuraMultiplier(AuraType.ModBattlePetXpPct));
xp += pet.PacketInfo.Exp;
while (xp >= nextLevelXp && level < SharedConst.MaxBattlePetLevel)
{
xp -= nextLevelXp;
xpEntry = CliDB.BattlePetXPGameTable.GetRow(++level);
if (xpEntry == null)
return;
nextLevelXp = (ushort)CliDB.GetBattlePetXPPerLevel(xpEntry);
player.UpdateCriteria(CriteriaType.BattlePetReachLevel, pet.PacketInfo.Species, level);
if (xpSource == BattlePetXpSource.PetBattle)
player.UpdateCriteria(CriteriaType.ActivelyEarnPetLevel, pet.PacketInfo.Species, level);
}
pet.PacketInfo.Level = level;
pet.PacketInfo.Exp = (ushort)(level < SharedConst.MaxBattlePetLevel ? xp : 0);
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);
// Update battle pet related update fields
Creature summonedBattlePet = player.GetSummonedBattlePet();
if (summonedBattlePet != null)
{
if (summonedBattlePet.GetBattlePetCompanionGUID() == guid)
{
summonedBattlePet.SetWildBattlePetLevel(pet.PacketInfo.Level);
player.SetBattlePetData(pet);
}
}
}
public void HealBattlePetsPct(byte pct)
+7
View File
@@ -425,6 +425,7 @@ namespace Game.DataStorage
ArtifactLevelXPGameTable = ReadGameTable<GtArtifactLevelXPRecord>("artifactLevelXP.txt");
BarberShopCostBaseGameTable = ReadGameTable<GtBarberShopCostBaseRecord>("BarberShopCostBase.txt");
BaseMPGameTable = ReadGameTable<GtBaseMPRecord>("BaseMp.txt");
BattlePetXPGameTable = ReadGameTable<GtBattlePetXPRecord>("BattlePetXP.txt");
CombatRatingsGameTable = ReadGameTable<GtCombatRatingsRecord>("CombatRatings.txt");
CombatRatingsMultByILvlGameTable = ReadGameTable<GtGenericMultByILvlRecord>("CombatRatingsMultByILvl.txt");
ItemSocketCostPerLevelGameTable = ReadGameTable<GtItemSocketCostPerLevelRecord>("ItemSocketCostPerLevel.txt");
@@ -737,6 +738,7 @@ namespace Game.DataStorage
public static GameTable<GtArtifactLevelXPRecord> ArtifactLevelXPGameTable;
public static GameTable<GtBarberShopCostBaseRecord> BarberShopCostBaseGameTable;
public static GameTable<GtBaseMPRecord> BaseMPGameTable;
public static GameTable<GtBattlePetXPRecord> BattlePetXPGameTable;
public static GameTable<GtCombatRatingsRecord> CombatRatingsGameTable;
public static GameTable<GtGenericMultByILvlRecord> CombatRatingsMultByILvlGameTable;
public static GameTable<GtHpPerStaRecord> HpPerStaGameTable;
@@ -844,6 +846,11 @@ namespace Game.DataStorage
return 0.0f;
}
public static float GetBattlePetXPPerLevel(GtBattlePetXPRecord row)
{
return row.Wins * row.Xp;
}
public static float GetIlvlStatMultiplier(GtGenericMultByILvlRecord row, InventoryType invType)
{
switch (invType)
@@ -49,6 +49,12 @@ namespace Game.DataStorage
public float DemonHunter;
}
public sealed class GtBattlePetXPRecord
{
public float Wins;
public float Xp;
}
public sealed class GtCombatRatingsRecord
{
public float Amplify;
+16
View File
@@ -5508,6 +5508,22 @@ namespace Game.Spells
ChatMsg chatType = (ChatMsg)effectInfo.MiscValueB;
unitCaster.Talk(broadcastTextId, chatType, Global.CreatureTextMgr.GetRangeForChatType(chatType), unitTarget);
}
[SpellEffectHandler(SpellEffectName.GrantBattlepetExperience)]
void EffectGrantBattlePetExperience()
{
if (effectHandleMode != SpellEffectHandleMode.HitTarget)
return;
Player playerCaster = m_caster.ToPlayer();
if (playerCaster == null)
return;
if (!unitTarget || !unitTarget.IsCreature())
return;
playerCaster.GetSession().GetBattlePetMgr().GrantBattlePetExperience(unitTarget.GetBattlePetCompanionGUID(), (ushort)damage, BattlePetXpSource.SpellEffect);
}
}
public class DispelableAura