Fix problem with max pet distance from owner. by VladimirMangos

--HG--
branch : trunk
This commit is contained in:
n0n4m3
2009-12-19 20:02:38 +01:00
parent acc95b66c9
commit 1c0f2d233f
3 changed files with 22 additions and 7 deletions
+2 -2
View File
@@ -514,8 +514,8 @@ void Pet::Update(uint32 diff)
{ {
// unsummon pet that lost owner // unsummon pet that lost owner
Player* owner = GetOwner(); Player* owner = GetOwner();
if(!owner || (!IsWithinDistInMap(owner, OWNER_MAX_DISTANCE) && !isPossessed()) || isControlled() && !owner->GetPetGUID()) if(!owner || (!IsWithinDistInMap(owner, GetMap()->GetVisibilityDistance()) && !isPossessed()) || isControlled() && !owner->GetPetGUID())
//if(!owner || (!IsWithinDistInMap(owner, OWNER_MAX_DISTANCE) && (owner->GetCharmGUID() && (owner->GetCharmGUID() != GetGUID()))) || (isControlled() && !owner->GetPetGUID())) //if(!owner || (!IsWithinDistInMap(owner, GetMap()->GetVisibilityDistance()) && (owner->GetCharmGUID() && (owner->GetCharmGUID() != GetGUID()))) || (isControlled() && !owner->GetPetGUID()))
{ {
Remove(PET_SAVE_NOT_IN_SLOT, true); Remove(PET_SAVE_NOT_IN_SLOT, true);
return; return;
-2
View File
@@ -116,8 +116,6 @@ typedef std::vector<uint32> AutoSpellList;
#define ACTIVE_SPELLS_MAX 4 #define ACTIVE_SPELLS_MAX 4
#define OWNER_MAX_DISTANCE 100.0f
#define PET_FOLLOW_DIST 1 #define PET_FOLLOW_DIST 1
#define PET_FOLLOW_ANGLE (M_PI/2) #define PET_FOLLOW_ANGLE (M_PI/2)
+20 -3
View File
@@ -1394,8 +1394,8 @@ void Player::Update( uint32 p_time )
SendUpdateToOutOfRangeGroupMembers(); SendUpdateToOutOfRangeGroupMembers();
Pet* pet = GetPet(); Pet* pet = GetPet();
if (pet && !IsWithinDistInMap(pet, OWNER_MAX_DISTANCE) && !pet->isPossessed()) if (pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityDistance()) && !pet->isPossessed())
//if(pet && !IsWithinDistInMap(pet, OWNER_MAX_DISTANCE) && (GetCharmGUID() && (pet->GetGUID() != GetCharmGUID()))) //if(pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityDistance()) && (GetCharmGUID() && (pet->GetGUID() != GetCharmGUID())))
RemovePet(pet, PET_SAVE_NOT_IN_SLOT, true); RemovePet(pet, PET_SAVE_NOT_IN_SLOT, true);
//we should execute delayed teleports only for alive(!) players //we should execute delayed teleports only for alive(!) players
@@ -1748,7 +1748,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
if (!(options & TELE_TO_NOT_UNSUMMON_PET)) if (!(options & TELE_TO_NOT_UNSUMMON_PET))
{ {
//same map, only remove pet if out of range for new position //same map, only remove pet if out of range for new position
if(pet && !pet->IsWithinDist3d(x,y,z, OWNER_MAX_DISTANCE)) if(pet && !pet->IsWithinDist3d(x,y,z, GetMap()->GetVisibilityDistance()))
UnsummonPetTemporaryIfAny(); UnsummonPetTemporaryIfAny();
} }
@@ -19302,12 +19302,27 @@ inline void UpdateVisibilityOf_helper(std::set<uint64>& s64, Player* target, std
v.insert(target); v.insert(target);
} }
template<class T>
inline void BeforeVisibilityDestroy(T* /*t*/, Player* /*p*/)
{
}
template<>
inline void BeforeVisibilityDestroy<Creature>(Creature* t, Player* p)
{
if (p->GetPetGUID()==t->GetGUID() && ((Creature*)t)->isPet())
((Pet*)t)->Remove(PET_SAVE_NOT_IN_SLOT, true);
}
void Player::UpdateVisibilityOf(WorldObject* target) void Player::UpdateVisibilityOf(WorldObject* target)
{ {
if(HaveAtClient(target)) if(HaveAtClient(target))
{ {
if(!target->isVisibleForInState(this, true)) if(!target->isVisibleForInState(this, true))
{ {
if (target->GetTypeId()==TYPEID_UNIT)
BeforeVisibilityDestroy<Creature>((Creature*)target,this);
target->DestroyForPlayer(this); target->DestroyForPlayer(this);
m_clientGUIDs.erase(target->GetGUID()); m_clientGUIDs.erase(target->GetGUID());
@@ -19359,6 +19374,8 @@ void Player::UpdateVisibilityOf(T* target, UpdateData& data, std::set<Unit*>& vi
{ {
if(!target->isVisibleForInState(this,true)) if(!target->isVisibleForInState(this,true))
{ {
BeforeVisibilityDestroy<T>(target,this);
target->BuildOutOfRangeUpdateBlock(&data); target->BuildOutOfRangeUpdateBlock(&data);
m_clientGUIDs.erase(target->GetGUID()); m_clientGUIDs.erase(target->GetGUID());