diff options
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 14 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 24 | ||||
-rwxr-xr-x | src/server/game/Handlers/PetHandler.cpp | 1 | ||||
-rwxr-xr-x | src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp | 21 |
4 files changed, 39 insertions, 21 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 12387d2ca6c..fde4f4c6959 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22379,6 +22379,7 @@ void Player::UpdateForQuestWorldObjects() obj->BuildCreateUpdateBlockForPlayer(&udata, this); break; } + } } } udata.BuildPacket(&packet); @@ -24151,10 +24152,17 @@ bool Player::canSeeSpellClickOn(Creature const* c) const return true; for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr) - if (itr->second.IsFitToRequirements(this, c)) - return true; + { + if (!itr->second.IsFitToRequirements(this, c)) + return false; - return false; + ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(c->GetEntry(), itr->second.spellId); + ConditionSourceInfo info = ConditionSourceInfo(const_cast<Player*>(this), const_cast<Creature*>(c)); + if (!sConditionMgr->IsObjectMeetToConditions(info, conds)) + return false; + } + + return true; } void Player::BuildPlayerTalentsInfoData(WorldPacket* data) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6c566fe9ed8..47c3c1a9395 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -15328,14 +15328,6 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) if (!victim->GetHealth()) return; - // Inform pets (if any) when player kills target) - if (Player* player = ToPlayer()) - { - Pet* pet = player->GetPet(); - if (pet && pet->isAlive() && pet->isControlled()) - pet->AI()->KilledUnit(victim); - } - // find player: owner of controlled `this` or `this` itself maybe Player* player = GetCharmerOrOwnerPlayerOrPlayerItself(); Creature* creature = victim->ToCreature(); @@ -15464,6 +15456,16 @@ void Unit::Kill(Unit* victim, bool durabilityLoss) victim->setDeathState(JUST_DIED); } + // Inform pets (if any) when player kills target) + // MUST come after victim->setDeathState(JUST_DIED); or pet next target + // selection will get stuck on same target and break pet react state + if (Player* player = ToPlayer()) + { + Pet* pet = player->GetPet(); + if (pet && pet->isAlive() && pet->isControlled()) + pet->AI()->KilledUnit(victim); + } + // 10% durability loss on death // clean InHateListOf if (Player* plrVictim = victim->ToPlayer()) @@ -17398,7 +17400,11 @@ bool CharmInfo::IsCommandAttack() void CharmInfo::SaveStayPosition() { - m_unit->GetPosition(m_stayX, m_stayY, m_stayZ); + //! At this point a new spline destination is enabled because of Unit::StopMoving() + G3D::Vector3 const stayPos = m_unit->movespline->FinalDestination(); + m_stayX = stayPos.x; + m_stayY = stayPos.y; + m_stayZ = stayPos.z; } void CharmInfo::GetStayPosition(float &x, float &y, float &z) diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 16b6a4bb714..8da7683459e 100755 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -155,6 +155,7 @@ void WorldSession::HandlePetActionHelper(Unit* pet, uint64 guid1, uint16 spellid case COMMAND_STAY: //flat=1792 //STAY pet->AttackStop(); pet->InterruptNonMeleeSpells(false); + pet->StopMoving(); pet->GetMotionMaster()->Clear(false); pet->GetMotionMaster()->MoveIdle(); charmInfo->SetCommandState(COMMAND_STAY); diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 964b4402438..064a8fc8297 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -38,15 +38,18 @@ void TargetedMovementGeneratorMedium<T,D>::_setTargetLocation(T &owner) return; float x, y, z; - - if (i_offset && i_target->IsWithinDistInMap(&owner,2*i_offset)) - { - if (!owner.movespline->Finalized()) - return; - - owner.GetPosition(x, y, z); - } - else if (!i_offset) + //! Following block of code deleted by MrSmite in issue 4891 + //! Code kept for learning and diagnostical purposes +// +// if (i_offset && i_target->IsWithinDistInMap(&owner,2*i_offset)) +// { +// if (!owner.movespline->Finalized()) +// return; +// +// owner.GetPosition(x, y, z); +// } +// else + if (!i_offset) { if (i_target->IsWithinMeleeRange(&owner)) return; |