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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user