aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp14
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp24
-rwxr-xr-xsrc/server/game/Handlers/PetHandler.cpp1
-rwxr-xr-xsrc/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp21
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;