Core/BattlePets: Misc fixes

Port From (https://github.com/TrinityCore/TrinityCore/commit/11cc5c0d3bd46b5e68bb549625ef9ca7294deb21)
This commit is contained in:
hondacrx
2021-10-16 18:12:25 -04:00
parent 2d976d7421
commit e9c6424cd8
11 changed files with 151 additions and 150 deletions
@@ -54,6 +54,7 @@ namespace Framework.Constants
public const int DefaultMaxBattlePetsPerSpecies = 3; public const int DefaultMaxBattlePetsPerSpecies = 3;
public const int BattlePetCageItemId = 82800; public const int BattlePetCageItemId = 82800;
public const int DefaultSummonBattlePetSpell = 118301; public const int DefaultSummonBattlePetSpell = 118301;
public const int SpellVisualUncagePet = 222;
/// <summary> /// <summary>
/// Lfg Const /// Lfg Const
@@ -151,8 +151,8 @@ namespace Framework.Database
PrepareStatement(LoginStatements.REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite, hasFanfare) VALUES (?, ?, ?, ?)"); PrepareStatement(LoginStatements.REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite, hasFanfare) VALUES (?, ?, ?, ?)");
// Battle Pets // Battle Pets
PrepareStatement(LoginStatements.SEL_BATTLE_PETS, "SELECT bp.guid, bp.species, bp.breed, bp.level, bp.exp, bp.health, bp.quality, bp.flags, bp.name, dn.genitive, dn.dative, dn.accusative, dn.instrumental, dn.prepositional FROM battle_pets bp LEFT JOIN battle_pet_declinedname dn ON bp.guid = dn.guid WHERE bp.battlenetAccountId = ?"); PrepareStatement(LoginStatements.SEL_BATTLE_PETS, "SELECT bp.guid, bp.species, bp.breed, bp.displayId, bp.level, bp.exp, bp.health, bp.quality, bp.flags, bp.name, dn.genitive, dn.dative, dn.accusative, dn.instrumental, dn.prepositional FROM battle_pets bp LEFT JOIN battle_pet_declinedname dn ON bp.guid = dn.guid WHERE bp.battlenetAccountId = ?");
PrepareStatement(LoginStatements.INS_BATTLE_PETS, "INSERT INTO battle_pets (guid, battlenetAccountId, species, breed, level, exp, health, quality, flags, name) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(LoginStatements.INS_BATTLE_PETS, "INSERT INTO battle_pets (guid, battlenetAccountId, species, breed, displayId, level, exp, health, quality, flags, name) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(LoginStatements.DEL_BATTLE_PETS, "DELETE FROM battle_pets WHERE battlenetAccountId = ? AND guid = ?"); PrepareStatement(LoginStatements.DEL_BATTLE_PETS, "DELETE FROM battle_pets WHERE battlenetAccountId = ? AND guid = ?");
PrepareStatement(LoginStatements.UPD_BATTLE_PETS, "UPDATE battle_pets SET level = ?, exp = ?, health = ?, quality = ?, flags = ?, name = ? WHERE battlenetAccountId = ? AND guid = ?"); PrepareStatement(LoginStatements.UPD_BATTLE_PETS, "UPDATE battle_pets SET level = ?, exp = ?, health = ?, quality = ?, flags = ?, name = ? WHERE battlenetAccountId = ? AND guid = ?");
PrepareStatement(LoginStatements.SEL_BATTLE_PET_SLOTS, "SELECT id, battlePetGuid, locked FROM battle_pet_slots WHERE battlenetAccountId = ?"); PrepareStatement(LoginStatements.SEL_BATTLE_PET_SLOTS, "SELECT id, battlePetGuid, locked FROM battle_pet_slots WHERE battlenetAccountId = ?");
+36 -33
View File
@@ -151,6 +151,22 @@ namespace Game.BattlePets
return _defaultQualityPerSpecies[species]; return _defaultQualityPerSpecies[species];
} }
public static uint SelectPetDisplay(BattlePetSpeciesRecord speciesEntry)
{
CreatureTemplate creatureTemplate = Global.ObjectMgr.GetCreatureTemplate(speciesEntry.CreatureID);
if (creatureTemplate != null)
{
if (!speciesEntry.GetFlags().HasFlag(BattlePetSpeciesFlags.RandomDisplay))
{
CreatureModel creatureModel = creatureTemplate.GetRandomValidModel();
if (creatureModel != null)
return creatureModel.CreatureDisplayID;
}
}
return 0;
}
public void LoadFromDB(SQLResult petsResult, SQLResult slotsResult) public void LoadFromDB(SQLResult petsResult, SQLResult slotsResult)
{ {
if (!petsResult.IsEmpty()) if (!petsResult.IsEmpty())
@@ -172,19 +188,20 @@ namespace Game.BattlePets
pet.PacketInfo.Guid = ObjectGuid.Create(HighGuid.BattlePet, petsResult.Read<ulong>(0)); pet.PacketInfo.Guid = ObjectGuid.Create(HighGuid.BattlePet, petsResult.Read<ulong>(0));
pet.PacketInfo.Species = species; pet.PacketInfo.Species = species;
pet.PacketInfo.Breed = petsResult.Read<ushort>(2); pet.PacketInfo.Breed = petsResult.Read<ushort>(2);
pet.PacketInfo.Level = petsResult.Read<ushort>(3); pet.PacketInfo.DisplayID = petsResult.Read<uint>(3);
pet.PacketInfo.Exp = petsResult.Read<ushort>(4); pet.PacketInfo.Level = petsResult.Read<ushort>(4);
pet.PacketInfo.Health = petsResult.Read<uint>(5); pet.PacketInfo.Exp = petsResult.Read<ushort>(5);
pet.PacketInfo.Quality = petsResult.Read<byte>(6); pet.PacketInfo.Health = petsResult.Read<uint>(6);
pet.PacketInfo.Flags = petsResult.Read<ushort>(7); pet.PacketInfo.Quality = petsResult.Read<byte>(7);
pet.PacketInfo.Name = petsResult.Read<string>(8); pet.PacketInfo.Flags = petsResult.Read<ushort>(8);
pet.PacketInfo.Name = petsResult.Read<string>(9);
pet.PacketInfo.CreatureID = speciesEntry.CreatureID; pet.PacketInfo.CreatureID = speciesEntry.CreatureID;
if (!petsResult.IsNull(9)) if (!petsResult.IsNull(10))
{ {
pet.DeclinedName = new(); pet.DeclinedName = new();
for (byte i = 0; i < SharedConst.MaxDeclinedNameCases; ++i) for (byte i = 0; i < SharedConst.MaxDeclinedNameCases; ++i)
pet.DeclinedName.name[i] = petsResult.Read<string>(9 + i); pet.DeclinedName.name[i] = petsResult.Read<string>(10 + i);
} }
pet.SaveInfo = BattlePetSaveInfo.Unchanged; pet.SaveInfo = BattlePetSaveInfo.Unchanged;
@@ -224,12 +241,13 @@ namespace Game.BattlePets
stmt.AddValue(1, _owner.GetBattlenetAccountId()); stmt.AddValue(1, _owner.GetBattlenetAccountId());
stmt.AddValue(2, pair.Value.PacketInfo.Species); stmt.AddValue(2, pair.Value.PacketInfo.Species);
stmt.AddValue(3, pair.Value.PacketInfo.Breed); stmt.AddValue(3, pair.Value.PacketInfo.Breed);
stmt.AddValue(4, pair.Value.PacketInfo.Level); stmt.AddValue(4, pair.Value.PacketInfo.DisplayID);
stmt.AddValue(5, pair.Value.PacketInfo.Exp); stmt.AddValue(5, pair.Value.PacketInfo.Level);
stmt.AddValue(6, pair.Value.PacketInfo.Health); stmt.AddValue(6, pair.Value.PacketInfo.Exp);
stmt.AddValue(7, pair.Value.PacketInfo.Quality); stmt.AddValue(7, pair.Value.PacketInfo.Health);
stmt.AddValue(8, pair.Value.PacketInfo.Flags); stmt.AddValue(8, pair.Value.PacketInfo.Quality);
stmt.AddValue(9, pair.Value.PacketInfo.Name); stmt.AddValue(9, pair.Value.PacketInfo.Flags);
stmt.AddValue(10, pair.Value.PacketInfo.Name);
trans.Append(stmt); trans.Append(stmt);
if (pair.Value.DeclinedName != null) if (pair.Value.DeclinedName != null)
@@ -309,21 +327,7 @@ namespace Game.BattlePets
return _pets.LookupByKey(guid.GetCounter()); return _pets.LookupByKey(guid.GetCounter());
} }
public void AddPet(uint species, uint creatureId, ushort level = 1) public void AddPet(uint species, uint display, ushort breed, BattlePetBreedQuality quality, ushort level = 1)
{
ushort breed = 3;// default B/B
BattlePetBreedQuality quality = 0;
if (_availableBreedsPerSpecies.ContainsKey(species))
breed = _availableBreedsPerSpecies[species].SelectRandom();
if (_defaultQualityPerSpecies.ContainsKey(species))
quality = _defaultQualityPerSpecies[species];
AddPet(species, creatureId, breed, quality, level);
}
public void AddPet(uint species, uint creatureId, ushort breed, BattlePetBreedQuality quality, ushort level = 1)
{ {
BattlePetSpeciesRecord battlePetSpecies = CliDB.BattlePetSpeciesStorage.LookupByKey(species); BattlePetSpeciesRecord battlePetSpecies = CliDB.BattlePetSpeciesStorage.LookupByKey(species);
if (battlePetSpecies == null) // should never happen if (battlePetSpecies == null) // should never happen
@@ -335,7 +339,8 @@ namespace Game.BattlePets
BattlePet pet = new(); BattlePet pet = new();
pet.PacketInfo.Guid = ObjectGuid.Create(HighGuid.BattlePet, Global.ObjectMgr.GetGenerator(HighGuid.BattlePet).Generate()); pet.PacketInfo.Guid = ObjectGuid.Create(HighGuid.BattlePet, Global.ObjectMgr.GetGenerator(HighGuid.BattlePet).Generate());
pet.PacketInfo.Species = species; pet.PacketInfo.Species = species;
pet.PacketInfo.CreatureID = creatureId; pet.PacketInfo.CreatureID = battlePetSpecies.CreatureID;
pet.PacketInfo.DisplayID = display;
pet.PacketInfo.Level = level; pet.PacketInfo.Level = level;
pet.PacketInfo.Exp = 0; pet.PacketInfo.Exp = 0;
pet.PacketInfo.Flags = 0; pet.PacketInfo.Flags = 0;
@@ -479,7 +484,7 @@ namespace Game.BattlePets
item.SetModifier(ItemModifier.BattlePetSpeciesId, pet.PacketInfo.Species); item.SetModifier(ItemModifier.BattlePetSpeciesId, pet.PacketInfo.Species);
item.SetModifier(ItemModifier.BattlePetBreedData, (uint)(pet.PacketInfo.Breed | (pet.PacketInfo.Quality << 24))); item.SetModifier(ItemModifier.BattlePetBreedData, (uint)(pet.PacketInfo.Breed | (pet.PacketInfo.Quality << 24)));
item.SetModifier(ItemModifier.BattlePetLevel, pet.PacketInfo.Level); item.SetModifier(ItemModifier.BattlePetLevel, pet.PacketInfo.Level);
item.SetModifier(ItemModifier.BattlePetDisplayId, pet.PacketInfo.CreatureID); item.SetModifier(ItemModifier.BattlePetDisplayId, pet.PacketInfo.DisplayID);
_owner.GetPlayer().SendNewItem(item, 1, true, false); _owner.GetPlayer().SendNewItem(item, 1, true, false);
@@ -526,8 +531,6 @@ namespace Game.BattlePets
_owner.GetPlayer().SetSummonedBattlePetGUID(guid); _owner.GetPlayer().SetSummonedBattlePetGUID(guid);
_owner.GetPlayer().SetCurrentBattlePetBreedQuality(pet.PacketInfo.Quality); _owner.GetPlayer().SetCurrentBattlePetBreedQuality(pet.PacketInfo.Quality);
_owner.GetPlayer().CastSpell(_owner.GetPlayer(), speciesEntry.SummonSpellID != 0 ? speciesEntry.SummonSpellID : SharedConst.DefaultSummonBattlePetSpell); _owner.GetPlayer().CastSpell(_owner.GetPlayer(), speciesEntry.SummonSpellID != 0 ? speciesEntry.SummonSpellID : SharedConst.DefaultSummonBattlePetSpell);
// TODO: set pet level, quality... update fields
} }
public void DismissPet() public void DismissPet()
+93 -93
View File
@@ -613,108 +613,108 @@ namespace Game.Entities
data.WriteBit(false); // HasPetBattleFullUpdate data.WriteBit(false); // HasPetBattleFullUpdate
data.FlushBits(); data.FlushBits();
// if (HasLocalScriptData) // if (HasLocalScriptData)
// { // {
// data.WriteBits(Data.length(), 7); // data.WriteBits(Data.length(), 7);
// data.FlushBits(); // data.FlushBits();
// data.WriteString(Data); // data.WriteString(Data);
// } // }
// if (HasPetBattleFullUpdate) // if (HasPetBattleFullUpdate)
// { // {
// for (std::size_t i = 0; i < 2; ++i) // for (std::size_t i = 0; i < 2; ++i)
// { // {
// *data << ObjectGuid(Players[i].CharacterID); // *data << ObjectGuid(Players[i].CharacterID);
// *data << int32(Players[i].TrapAbilityID); // *data << int32(Players[i].TrapAbilityID);
// *data << int32(Players[i].TrapStatus); // *data << int32(Players[i].TrapStatus);
// *data << uint16(Players[i].RoundTimeSecs); // *data << uint16(Players[i].RoundTimeSecs);
// *data << int8(Players[i].FrontPet); // *data << int8(Players[i].FrontPet);
// *data << uint8(Players[i].InputFlags); // *data << uint8(Players[i].InputFlags);
// data.WriteBits(Players[i].Pets.size(), 2); // data.WriteBits(Players[i].Pets.size(), 2);
// data.FlushBits(); // data.FlushBits();
// for (std::size_t j = 0; j < Players[i].Pets.size(); ++j) // for (std::size_t j = 0; j < Players[i].Pets.size(); ++j)
// { // {
// *data << ObjectGuid(Players[i].Pets[j].BattlePetGUID); // *data << ObjectGuid(Players[i].Pets[j].BattlePetGUID);
// *data << int32(Players[i].Pets[j].SpeciesID); // *data << int32(Players[i].Pets[j].SpeciesID);
// *data << int32(Players[i].Pets[j].DisplayID); // *data << int32(Players[i].Pets[j].CreatureID);
// *data << int32(Players[i].Pets[j].CollarID); // *data << int32(Players[i].Pets[j].DisplayID);
// *data << int16(Players[i].Pets[j].Level); // *data << int16(Players[i].Pets[j].Level);
// *data << int16(Players[i].Pets[j].Xp); // *data << int16(Players[i].Pets[j].Xp);
// *data << int32(Players[i].Pets[j].CurHealth); // *data << int32(Players[i].Pets[j].CurHealth);
// *data << int32(Players[i].Pets[j].MaxHealth); // *data << int32(Players[i].Pets[j].MaxHealth);
// *data << int32(Players[i].Pets[j].Power); // *data << int32(Players[i].Pets[j].Power);
// *data << int32(Players[i].Pets[j].Speed); // *data << int32(Players[i].Pets[j].Speed);
// *data << int32(Players[i].Pets[j].NpcTeamMemberID); // *data << int32(Players[i].Pets[j].NpcTeamMemberID);
// *data << uint16(Players[i].Pets[j].BreedQuality); // *data << uint16(Players[i].Pets[j].BreedQuality);
// *data << uint16(Players[i].Pets[j].StatusFlags); // *data << uint16(Players[i].Pets[j].StatusFlags);
// *data << int8(Players[i].Pets[j].Slot); // *data << int8(Players[i].Pets[j].Slot);
// *data << uint(Players[i].Pets[j].Abilities.size()); // *data << uint(Players[i].Pets[j].Abilities.size());
// *data << uint(Players[i].Pets[j].Auras.size()); // *data << uint(Players[i].Pets[j].Auras.size());
// *data << uint(Players[i].Pets[j].States.size()); // *data << uint(Players[i].Pets[j].States.size());
// for (std::size_t k = 0; k < Players[i].Pets[j].Abilities.size(); ++k) // for (std::size_t k = 0; k < Players[i].Pets[j].Abilities.size(); ++k)
// { // {
// *data << int32(Players[i].Pets[j].Abilities[k].AbilityID); // *data << int32(Players[i].Pets[j].Abilities[k].AbilityID);
// *data << int16(Players[i].Pets[j].Abilities[k].CooldownRemaining); // *data << int16(Players[i].Pets[j].Abilities[k].CooldownRemaining);
// *data << int16(Players[i].Pets[j].Abilities[k].LockdownRemaining); // *data << int16(Players[i].Pets[j].Abilities[k].LockdownRemaining);
// *data << int8(Players[i].Pets[j].Abilities[k].AbilityIndex); // *data << int8(Players[i].Pets[j].Abilities[k].AbilityIndex);
// *data << uint8(Players[i].Pets[j].Abilities[k].Pboid); // *data << uint8(Players[i].Pets[j].Abilities[k].Pboid);
// } // }
// for (std::size_t k = 0; k < Players[i].Pets[j].Auras.size(); ++k) // for (std::size_t k = 0; k < Players[i].Pets[j].Auras.size(); ++k)
// { // {
// *data << int32(Players[i].Pets[j].Auras[k].AbilityID); // *data << int32(Players[i].Pets[j].Auras[k].AbilityID);
// *data << uint(Players[i].Pets[j].Auras[k].InstanceID); // *data << uint(Players[i].Pets[j].Auras[k].InstanceID);
// *data << int32(Players[i].Pets[j].Auras[k].RoundsRemaining); // *data << int32(Players[i].Pets[j].Auras[k].RoundsRemaining);
// *data << int32(Players[i].Pets[j].Auras[k].CurrentRound); // *data << int32(Players[i].Pets[j].Auras[k].CurrentRound);
// *data << uint8(Players[i].Pets[j].Auras[k].CasterPBOID); // *data << uint8(Players[i].Pets[j].Auras[k].CasterPBOID);
// } // }
// for (std::size_t k = 0; k < Players[i].Pets[j].States.size(); ++k) // for (std::size_t k = 0; k < Players[i].Pets[j].States.size(); ++k)
// { // {
// *data << uint(Players[i].Pets[j].States[k].StateID); // *data << uint(Players[i].Pets[j].States[k].StateID);
// *data << int32(Players[i].Pets[j].States[k].StateValue); // *data << int32(Players[i].Pets[j].States[k].StateValue);
// } // }
// data.WriteBits(Players[i].Pets[j].CustomName.length(), 7); // data.WriteBits(Players[i].Pets[j].CustomName.length(), 7);
// data.FlushBits(); // data.FlushBits();
// data.WriteString(Players[i].Pets[j].CustomName); // data.WriteString(Players[i].Pets[j].CustomName);
// } // }
// } // }
// for (std::size_t i = 0; i < 3; ++i) // for (std::size_t i = 0; i < 3; ++i)
// { // {
// *data << uint(Enviros[j].Auras.size()); // *data << uint(Enviros[j].Auras.size());
// *data << uint(Enviros[j].States.size()); // *data << uint(Enviros[j].States.size());
// for (std::size_t j = 0; j < Enviros[j].Auras.size(); ++j) // for (std::size_t j = 0; j < Enviros[j].Auras.size(); ++j)
// { // {
// *data << int32(Enviros[j].Auras[j].AbilityID); // *data << int32(Enviros[j].Auras[j].AbilityID);
// *data << uint(Enviros[j].Auras[j].InstanceID); // *data << uint(Enviros[j].Auras[j].InstanceID);
// *data << int32(Enviros[j].Auras[j].RoundsRemaining); // *data << int32(Enviros[j].Auras[j].RoundsRemaining);
// *data << int32(Enviros[j].Auras[j].CurrentRound); // *data << int32(Enviros[j].Auras[j].CurrentRound);
// *data << uint8(Enviros[j].Auras[j].CasterPBOID); // *data << uint8(Enviros[j].Auras[j].CasterPBOID);
// } // }
// for (std::size_t j = 0; j < Enviros[j].States.size(); ++j) // for (std::size_t j = 0; j < Enviros[j].States.size(); ++j)
// { // {
// *data << uint(Enviros[i].States[j].StateID); // *data << uint(Enviros[i].States[j].StateID);
// *data << int32(Enviros[i].States[j].StateValue); // *data << int32(Enviros[i].States[j].StateValue);
// } // }
// } // }
// *data << uint16(WaitingForFrontPetsMaxSecs); // *data << uint16(WaitingForFrontPetsMaxSecs);
// *data << uint16(PvpMaxRoundTime); // *data << uint16(PvpMaxRoundTime);
// *data << int32(CurRound); // *data << int32(CurRound);
// *data << uint(NpcCreatureID); // *data << uint(NpcCreatureID);
// *data << uint(NpcDisplayID); // *data << uint(NpcDisplayID);
// *data << int8(CurPetBattleState); // *data << int8(CurPetBattleState);
// *data << uint8(ForfeitPenalty); // *data << uint8(ForfeitPenalty);
// *data << ObjectGuid(InitialWildPetGUID); // *data << ObjectGuid(InitialWildPetGUID);
// data.WriteBit(IsPVP); // data.WriteBit(IsPVP);
// data.WriteBit(CanAwardXP); // data.WriteBit(CanAwardXP);
// data.FlushBits(); // data.FlushBits();
// } // }
} }
if (flags.ActivePlayer) if (flags.ActivePlayer)
+1 -1
View File
@@ -2658,7 +2658,7 @@ namespace Game.Entities
{ {
if (entry.SummonSpellID == spellId && GetSession().GetBattlePetMgr().GetPetCount(entry.Id) == 0) if (entry.SummonSpellID == spellId && GetSession().GetBattlePetMgr().GetPetCount(entry.Id) == 0)
{ {
GetSession().GetBattlePetMgr().AddPet(entry.Id, entry.CreatureID, BattlePetMgr.RollPetBreed(entry.Id), BattlePetMgr.GetDefaultPetQuality(entry.Id)); GetSession().GetBattlePetMgr().AddPet(entry.Id, BattlePetMgr.SelectPetDisplay(entry), BattlePetMgr.RollPetBreed(entry.Id), BattlePetMgr.GetDefaultPetQuality(entry.Id));
UpdateCriteria(CriteriaType.UniquePetsOwned); UpdateCriteria(CriteriaType.UniquePetsOwned);
break; break;
} }
+4 -3
View File
@@ -1069,11 +1069,12 @@ namespace Game.Entities
SendMessageToSet(cancelSpellVisual, true); SendMessageToSet(cancelSpellVisual, true);
} }
public void SendPlaySpellVisual(ObjectGuid targetGuid, uint spellVisualId, uint missReason, uint reflectStatus, float travelSpeed, bool speedAsTime = false) public void SendPlaySpellVisual(Unit target, uint spellVisualId, uint missReason, uint reflectStatus, float travelSpeed, bool speedAsTime = false)
{ {
PlaySpellVisual playSpellVisual = new(); PlaySpellVisual playSpellVisual = new();
playSpellVisual.Source = GetGUID(); playSpellVisual.Source = GetGUID();
playSpellVisual.Target = targetGuid; // exclusive with TargetPosition playSpellVisual.Target = target.GetGUID();
playSpellVisual.TargetPosition = target.GetPosition();
playSpellVisual.SpellVisualID = spellVisualId; playSpellVisual.SpellVisualID = spellVisualId;
playSpellVisual.TravelSpeed = travelSpeed; playSpellVisual.TravelSpeed = travelSpeed;
playSpellVisual.MissReason = (ushort)missReason; playSpellVisual.MissReason = (ushort)missReason;
@@ -1086,7 +1087,7 @@ namespace Game.Entities
{ {
PlaySpellVisual playSpellVisual = new(); PlaySpellVisual playSpellVisual = new();
playSpellVisual.Source = GetGUID(); playSpellVisual.Source = GetGUID();
playSpellVisual.TargetPosition = targetPosition; // exclusive with Target playSpellVisual.TargetPosition = targetPosition;
playSpellVisual.LaunchDelay = launchDelay; playSpellVisual.LaunchDelay = launchDelay;
playSpellVisual.SpellVisualID = spellVisualId; playSpellVisual.SpellVisualID = spellVisualId;
playSpellVisual.TravelSpeed = travelSpeed; playSpellVisual.TravelSpeed = travelSpeed;
+1 -1
View File
@@ -1067,7 +1067,7 @@ namespace Game
var entry = Global.SpellMgr.GetBattlePetSpecies(spellToLearn); var entry = Global.SpellMgr.GetBattlePetSpecies(spellToLearn);
if (entry != null) if (entry != null)
{ {
GetBattlePetMgr().AddPet(entry.Id, entry.CreatureID, BattlePetMgr.RollPetBreed(entry.Id), BattlePetMgr.GetDefaultPetQuality(entry.Id)); GetBattlePetMgr().AddPet(entry.Id, BattlePetMgr.SelectPetDisplay(entry), BattlePetMgr.RollPetBreed(entry.Id), BattlePetMgr.GetDefaultPetQuality(entry.Id));
_player.UpdateCriteria(CriteriaType.UniquePetsOwned); _player.UpdateCriteria(CriteriaType.UniquePetsOwned);
} }
@@ -243,7 +243,7 @@ namespace Game.Networking.Packets
data .WritePackedGuid( Guid); data .WritePackedGuid( Guid);
data.WriteUInt32(Species); data.WriteUInt32(Species);
data.WriteUInt32(CreatureID); data.WriteUInt32(CreatureID);
data.WriteUInt32(CollarID); data.WriteUInt32(DisplayID);
data.WriteUInt16(Breed); data.WriteUInt16(Breed);
data.WriteUInt16(Level); data.WriteUInt16(Level);
data.WriteUInt16(Exp); data.WriteUInt16(Exp);
@@ -255,7 +255,7 @@ namespace Game.Networking.Packets
data .WriteUInt8( Quality); data .WriteUInt8( Quality);
data.WriteBits(Name.GetByteCount(), 7); data.WriteBits(Name.GetByteCount(), 7);
data.WriteBit(OwnerInfo.HasValue); // HasOwnerInfo data.WriteBit(OwnerInfo.HasValue); // HasOwnerInfo
data.WriteBit(Name.IsEmpty()); // NoRename data.WriteBit(false); // NoRename
data.FlushBits(); data.FlushBits();
data.WriteString(Name); data.WriteString(Name);
@@ -278,7 +278,7 @@ namespace Game.Networking.Packets
public ObjectGuid Guid; public ObjectGuid Guid;
public uint Species; public uint Species;
public uint CreatureID; public uint CreatureID;
public uint CollarID; public uint DisplayID;
public ushort Breed; public ushort Breed;
public ushort Level; public ushort Level;
public ushort Exp; public ushort Exp;
@@ -744,9 +744,9 @@ namespace Game.Networking.Packets
} }
public ObjectGuid Source; public ObjectGuid Source;
public ObjectGuid Target; // Exclusive with TargetPosition public ObjectGuid Target;
public ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0 public ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0
public Vector3 TargetPosition; // Exclusive with Target public Vector3 TargetPosition; // Overrides missile destination for SpellVisual::SpellVisualMissileSetID
public uint SpellVisualID; public uint SpellVisualID;
public float TravelSpeed; public float TravelSpeed;
public ushort HitReason; public ushort HitReason;
+7 -12
View File
@@ -5454,47 +5454,42 @@ namespace Game.Spells
if (!m_CastItem || !m_caster || !m_caster.IsTypeId(TypeId.Player)) if (!m_CastItem || !m_caster || !m_caster.IsTypeId(TypeId.Player))
return; return;
Player plr = m_caster.ToPlayer();
// are we allowed to learn battle pets without it?
/*if (plr.HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_PET_BATTLES_UNLOCKED))
return; // send some error*/
uint speciesId = m_CastItem.GetModifier(ItemModifier.BattlePetSpeciesId); uint speciesId = m_CastItem.GetModifier(ItemModifier.BattlePetSpeciesId);
ushort breed = (ushort)(m_CastItem.GetModifier(ItemModifier.BattlePetBreedData) & 0xFFFFFF); ushort breed = (ushort)(m_CastItem.GetModifier(ItemModifier.BattlePetBreedData) & 0xFFFFFF);
BattlePetBreedQuality quality = (BattlePetBreedQuality)((m_CastItem.GetModifier(ItemModifier.BattlePetBreedData) >> 24) & 0xFF); BattlePetBreedQuality quality = (BattlePetBreedQuality)((m_CastItem.GetModifier(ItemModifier.BattlePetBreedData) >> 24) & 0xFF);
ushort level = (ushort)m_CastItem.GetModifier(ItemModifier.BattlePetLevel); ushort level = (ushort)m_CastItem.GetModifier(ItemModifier.BattlePetLevel);
uint creatureId = m_CastItem.GetModifier(ItemModifier.BattlePetDisplayId); uint displayId = m_CastItem.GetModifier(ItemModifier.BattlePetDisplayId);
BattlePetSpeciesRecord speciesEntry = CliDB.BattlePetSpeciesStorage.LookupByKey(speciesId); BattlePetSpeciesRecord speciesEntry = CliDB.BattlePetSpeciesStorage.LookupByKey(speciesId);
if (speciesEntry == null) if (speciesEntry == null)
return; return;
Player plr = m_caster.ToPlayer();
BattlePetMgr battlePetMgr = plr.GetSession().GetBattlePetMgr(); BattlePetMgr battlePetMgr = plr.GetSession().GetBattlePetMgr();
if (battlePetMgr == null) if (battlePetMgr == null)
return; return;
// TODO: This means if you put your highest lvl pet into cage, you won't be able to uncage it again which is probably wrong.
// We will need to store maxLearnedLevel somewhere to avoid this behaviour.
if (battlePetMgr.GetMaxPetLevel() < level) if (battlePetMgr.GetMaxPetLevel() < level)
{ {
battlePetMgr.SendError(BattlePetError.TooHighLevelToUncage, creatureId); // or speciesEntry.CreatureID battlePetMgr.SendError(BattlePetError.TooHighLevelToUncage, speciesEntry.CreatureID);
SendCastResult(SpellCastResult.CantAddBattlePet); SendCastResult(SpellCastResult.CantAddBattlePet);
return; return;
} }
if (battlePetMgr.HasMaxPetCount(speciesEntry)) if (battlePetMgr.HasMaxPetCount(speciesEntry))
{ {
battlePetMgr.SendError(BattlePetError.CantHaveMorePetsOfThatType, creatureId); // or speciesEntry.CreatureID battlePetMgr.SendError(BattlePetError.CantHaveMorePetsOfThatType, speciesEntry.CreatureID);
SendCastResult(SpellCastResult.CantAddBattlePet); SendCastResult(SpellCastResult.CantAddBattlePet);
return; return;
} }
battlePetMgr.AddPet(speciesId, creatureId, breed, quality, level); battlePetMgr.AddPet(speciesId, displayId, breed, quality, level);
if (!plr.HasSpell(speciesEntry.SummonSpellID)) if (!plr.HasSpell(speciesEntry.SummonSpellID))
plr.LearnSpell(speciesEntry.SummonSpellID, false); plr.LearnSpell(speciesEntry.SummonSpellID, false);
plr.SendPlaySpellVisual(plr, SharedConst.SpellVisualUncagePet, 0, 0, 0.0f, false);
plr.DestroyItem(m_CastItem.GetBagSlot(), m_CastItem.GetSlot(), true); plr.DestroyItem(m_CastItem.GetBagSlot(), m_CastItem.GetSlot(), true);
m_CastItem = null; m_CastItem = null;
} }
@@ -0,0 +1 @@
ALTER TABLE `battle_pets` ADD `displayId` int(11) NOT NULL DEFAULT '0' AFTER `breed`;