diff options
| author | Vincent_Michael <Vincent_Michael@gmx.de> | 2013-12-08 20:27:46 +0100 |
|---|---|---|
| committer | Vincent_Michael <Vincent_Michael@gmx.de> | 2013-12-08 20:27:46 +0100 |
| commit | e8be55aa8b3facd776303a34acf6048f50dcfa51 (patch) | |
| tree | db95abc0bd54a7693025306c3b435d672da00800 /src/server/game/Spells/SpellEffects.cpp | |
| parent | 214d0822ce41fb326a9763ae7507923fdfa659f1 (diff) | |
| parent | 5c15e88da9037af885c40a55aeea581c520148d7 (diff) | |
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts:
src/server/game/AI/CoreAI/TotemAI.cpp
src/server/game/Entities/Player/Player.cpp
src/server/game/Entities/Unit/Unit.cpp
src/server/game/Globals/ObjectMgr.cpp
src/server/game/Guilds/Guild.cpp
src/server/game/Guilds/Guild.h
src/server/game/Movement/Spline/MoveSplineInit.cpp
src/server/game/Movement/Spline/MovementPacketBuilder.cpp
src/server/game/Movement/Spline/MovementPacketBuilder.h
src/server/game/Spells/SpellMgr.cpp
src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp
src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp
src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
src/server/scripts/Kalimdor/zone_mulgore.cpp
src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp
src/server/shared/Database/Implementation/CharacterDatabase.cpp
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 55 |
1 files changed, 41 insertions, 14 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 51fd45f9880..621c4e2bce0 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4768,28 +4768,43 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - Player* player = m_caster->ToPlayer(); - if (!player) + if (damage < 0) return; - Pet* pet = player->GetPet(); - if (pet && pet->IsAlive()) + Player* player = m_caster->ToPlayer(); + if (!player) return; - if (damage < 0) - return; - float x, y, z; - player->GetPosition(x, y, z); - if (!pet) + // Maybe player dismissed dead pet or pet despawned? + bool hadPet = true; + if (!player->GetPet()) { - player->SummonPet(0, x, y, z, player->GetOrientation(), SUMMON_PET, 0); - pet = player->GetPet(); + // Position passed to SummonPet is irrelevant with current implementation, + // pet will be relocated without using these coords in Pet::LoadPetFromDB + player->SummonPet(0, 0.0f, 0.0f, 0.0f, 0.0f, SUMMON_PET, 0); + hadPet = false; } + + // TODO: Better to fail Hunter's "Revive Pet" at cast instead of here when casting ends + Pet* pet = player->GetPet(); // Attempt to get current pet if (!pet) return; - player->GetMap()->CreatureRelocation(pet, x, y, z, player->GetOrientation()); + // TODO: Better to fail Hunter's "Revive Pet" at cast instead of here when casting ends + if (pet->IsAlive()) + return; + + // If player did have a pet before reviving, teleport it + if (hadPet) + { + // Reposition the pet's corpse before reviving so as not to grab aggro + // We can use a different, more accurate version of GetClosePoint() since we have a pet + float x, y, z; // Will be used later to reposition the pet if we have one + player->GetClosePoint(x, y, z, pet->GetObjectSize(), PET_FOLLOW_DIST, pet->GetFollowAngle()); + pet->NearTeleportTo(x, y, z, player->GetOrientation()); + pet->Relocate(x, y, z, player->GetOrientation()); // This is needed so SaveStayPosition() will get the proper coords. + } pet->SetUInt32Value(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_NONE); pet->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); @@ -4797,8 +4812,20 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) pet->ClearUnitState(uint32(UNIT_STATE_ALL_STATE)); pet->SetHealth(pet->CountPctFromMaxHealth(damage)); - //pet->AIM_Initialize(); - //player->PetSpellInitialize(); + // Reset things for when the AI to takes over + CharmInfo *ci = pet->GetCharmInfo(); + if (ci) + { + // In case the pet was at stay, we don't want it running back + ci->SaveStayPosition(); + ci->SetIsAtStay(ci->HasCommandState(COMMAND_STAY)); + + ci->SetIsFollowing(false); + ci->SetIsCommandAttack(false); + ci->SetIsCommandFollow(false); + ci->SetIsReturning(false); + } + pet->SavePetToDB(PET_SAVE_AS_CURRENT); } |
