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
|
AccountObtainPetThroughBattle = 157, /*NYI*/ // (Account Only) Obtain a pet through battle
|
||||||
WinPetBattle = 158, /*NYI*/ // Win a pet battle
|
WinPetBattle = 158, /*NYI*/ // Win a pet battle
|
||||||
LosePetBattle = 159, /*NYI*/ // Lose 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
|
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}"
|
EnterArea = 163, /*NYI*/ // Enter Map Area "{AreaTable}"
|
||||||
LeaveArea = 164, /*NYI*/ // Leave Map Area "{AreaTable}"
|
LeaveArea = 164, /*NYI*/ // Leave Map Area "{AreaTable}"
|
||||||
DefeatDungeonEncounter = 165, /*NYI*/ // Defeat Encounter "{DungeonEncounter}"
|
DefeatDungeonEncounter = 165, /*NYI*/ // Defeat Encounter "{DungeonEncounter}"
|
||||||
|
|||||||
@@ -77,4 +77,12 @@ namespace Framework.Constants
|
|||||||
|
|
||||||
Max
|
Max
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum BattlePetXpSource
|
||||||
|
{
|
||||||
|
PetBattle = 0,
|
||||||
|
SpellEffect = 1,
|
||||||
|
|
||||||
|
Count
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ namespace Game.Achievements
|
|||||||
case CriteriaType.PVPKillInArea:
|
case CriteriaType.PVPKillInArea:
|
||||||
case CriteriaType.WinArena: // This also behaves like CriteriaType.WinAnyRankedArena
|
case CriteriaType.WinArena: // This also behaves like CriteriaType.WinAnyRankedArena
|
||||||
case CriteriaType.Login:
|
case CriteriaType.Login:
|
||||||
|
case CriteriaType.BattlePetReachLevel:
|
||||||
|
case CriteriaType.ActivelyEarnPetLevel:
|
||||||
case CriteriaType.PlaceGarrisonBuilding:
|
case CriteriaType.PlaceGarrisonBuilding:
|
||||||
case CriteriaType.ActivateAnyGarrisonBuilding:
|
case CriteriaType.ActivateAnyGarrisonBuilding:
|
||||||
case CriteriaType.HonorLevelIncrease:
|
case CriteriaType.HonorLevelIncrease:
|
||||||
@@ -389,9 +391,7 @@ namespace Game.Achievements
|
|||||||
case CriteriaType.CompleteScenario:
|
case CriteriaType.CompleteScenario:
|
||||||
case CriteriaType.AccountObtainPetThroughBattle:
|
case CriteriaType.AccountObtainPetThroughBattle:
|
||||||
case CriteriaType.WinPetBattle:
|
case CriteriaType.WinPetBattle:
|
||||||
case CriteriaType.BattlePetReachLevel:
|
|
||||||
case CriteriaType.PlayerObtainPetThroughBattle:
|
case CriteriaType.PlayerObtainPetThroughBattle:
|
||||||
case CriteriaType.ActivelyEarnPetLevel:
|
|
||||||
case CriteriaType.EnterArea:
|
case CriteriaType.EnterArea:
|
||||||
case CriteriaType.LeaveArea:
|
case CriteriaType.LeaveArea:
|
||||||
case CriteriaType.DefeatDungeonEncounter:
|
case CriteriaType.DefeatDungeonEncounter:
|
||||||
@@ -812,6 +812,8 @@ namespace Game.Achievements
|
|||||||
case CriteriaType.CurrencyGained:
|
case CriteriaType.CurrencyGained:
|
||||||
case CriteriaType.PlaceGarrisonBuilding:
|
case CriteriaType.PlaceGarrisonBuilding:
|
||||||
case CriteriaType.UniquePetsOwned:
|
case CriteriaType.UniquePetsOwned:
|
||||||
|
case CriteriaType.BattlePetReachLevel:
|
||||||
|
case CriteriaType.ActivelyEarnPetLevel:
|
||||||
case CriteriaType.LearnAnyTransmogInSlot:
|
case CriteriaType.LearnAnyTransmogInSlot:
|
||||||
case CriteriaType.ParagonLevelIncreaseWithFaction:
|
case CriteriaType.ParagonLevelIncreaseWithFaction:
|
||||||
case CriteriaType.PlayerHasEarnedHonor:
|
case CriteriaType.PlayerHasEarnedHonor:
|
||||||
@@ -1207,6 +1209,11 @@ namespace Game.Achievements
|
|||||||
if (miscValue1 != criteria.Entry.Asset)
|
if (miscValue1 != criteria.Entry.Asset)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
|
case CriteriaType.BattlePetReachLevel:
|
||||||
|
case CriteriaType.ActivelyEarnPetLevel:
|
||||||
|
if (miscValue1 == 0 || miscValue2 == 0 || miscValue2 != criteria.Entry.Asset)
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
case CriteriaType.ActivelyReachLevel:
|
case CriteriaType.ActivelyReachLevel:
|
||||||
if (miscValue1 == 0 || miscValue1 != criteria.Entry.Asset)
|
if (miscValue1 == 0 || miscValue1 != criteria.Entry.Asset)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -625,7 +625,79 @@ namespace Game.BattlePets
|
|||||||
SendUpdates(updates, false);
|
SendUpdates(updates, false);
|
||||||
|
|
||||||
// UF::PlayerData::CurrentBattlePetBreedQuality isn't updated (Intended)
|
// 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)
|
public void HealBattlePetsPct(byte pct)
|
||||||
|
|||||||
@@ -425,6 +425,7 @@ namespace Game.DataStorage
|
|||||||
ArtifactLevelXPGameTable = ReadGameTable<GtArtifactLevelXPRecord>("artifactLevelXP.txt");
|
ArtifactLevelXPGameTable = ReadGameTable<GtArtifactLevelXPRecord>("artifactLevelXP.txt");
|
||||||
BarberShopCostBaseGameTable = ReadGameTable<GtBarberShopCostBaseRecord>("BarberShopCostBase.txt");
|
BarberShopCostBaseGameTable = ReadGameTable<GtBarberShopCostBaseRecord>("BarberShopCostBase.txt");
|
||||||
BaseMPGameTable = ReadGameTable<GtBaseMPRecord>("BaseMp.txt");
|
BaseMPGameTable = ReadGameTable<GtBaseMPRecord>("BaseMp.txt");
|
||||||
|
BattlePetXPGameTable = ReadGameTable<GtBattlePetXPRecord>("BattlePetXP.txt");
|
||||||
CombatRatingsGameTable = ReadGameTable<GtCombatRatingsRecord>("CombatRatings.txt");
|
CombatRatingsGameTable = ReadGameTable<GtCombatRatingsRecord>("CombatRatings.txt");
|
||||||
CombatRatingsMultByILvlGameTable = ReadGameTable<GtGenericMultByILvlRecord>("CombatRatingsMultByILvl.txt");
|
CombatRatingsMultByILvlGameTable = ReadGameTable<GtGenericMultByILvlRecord>("CombatRatingsMultByILvl.txt");
|
||||||
ItemSocketCostPerLevelGameTable = ReadGameTable<GtItemSocketCostPerLevelRecord>("ItemSocketCostPerLevel.txt");
|
ItemSocketCostPerLevelGameTable = ReadGameTable<GtItemSocketCostPerLevelRecord>("ItemSocketCostPerLevel.txt");
|
||||||
@@ -737,6 +738,7 @@ namespace Game.DataStorage
|
|||||||
public static GameTable<GtArtifactLevelXPRecord> ArtifactLevelXPGameTable;
|
public static GameTable<GtArtifactLevelXPRecord> ArtifactLevelXPGameTable;
|
||||||
public static GameTable<GtBarberShopCostBaseRecord> BarberShopCostBaseGameTable;
|
public static GameTable<GtBarberShopCostBaseRecord> BarberShopCostBaseGameTable;
|
||||||
public static GameTable<GtBaseMPRecord> BaseMPGameTable;
|
public static GameTable<GtBaseMPRecord> BaseMPGameTable;
|
||||||
|
public static GameTable<GtBattlePetXPRecord> BattlePetXPGameTable;
|
||||||
public static GameTable<GtCombatRatingsRecord> CombatRatingsGameTable;
|
public static GameTable<GtCombatRatingsRecord> CombatRatingsGameTable;
|
||||||
public static GameTable<GtGenericMultByILvlRecord> CombatRatingsMultByILvlGameTable;
|
public static GameTable<GtGenericMultByILvlRecord> CombatRatingsMultByILvlGameTable;
|
||||||
public static GameTable<GtHpPerStaRecord> HpPerStaGameTable;
|
public static GameTable<GtHpPerStaRecord> HpPerStaGameTable;
|
||||||
@@ -844,6 +846,11 @@ namespace Game.DataStorage
|
|||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static float GetBattlePetXPPerLevel(GtBattlePetXPRecord row)
|
||||||
|
{
|
||||||
|
return row.Wins * row.Xp;
|
||||||
|
}
|
||||||
|
|
||||||
public static float GetIlvlStatMultiplier(GtGenericMultByILvlRecord row, InventoryType invType)
|
public static float GetIlvlStatMultiplier(GtGenericMultByILvlRecord row, InventoryType invType)
|
||||||
{
|
{
|
||||||
switch (invType)
|
switch (invType)
|
||||||
|
|||||||
@@ -49,6 +49,12 @@ namespace Game.DataStorage
|
|||||||
public float DemonHunter;
|
public float DemonHunter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public sealed class GtBattlePetXPRecord
|
||||||
|
{
|
||||||
|
public float Wins;
|
||||||
|
public float Xp;
|
||||||
|
}
|
||||||
|
|
||||||
public sealed class GtCombatRatingsRecord
|
public sealed class GtCombatRatingsRecord
|
||||||
{
|
{
|
||||||
public float Amplify;
|
public float Amplify;
|
||||||
|
|||||||
@@ -5508,6 +5508,22 @@ namespace Game.Spells
|
|||||||
ChatMsg chatType = (ChatMsg)effectInfo.MiscValueB;
|
ChatMsg chatType = (ChatMsg)effectInfo.MiscValueB;
|
||||||
unitCaster.Talk(broadcastTextId, chatType, Global.CreatureTextMgr.GetRangeForChatType(chatType), unitTarget);
|
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
|
public class DispelableAura
|
||||||
|
|||||||
Reference in New Issue
Block a user