From 3e133c47865d57816132300df2749b297f97bce0 Mon Sep 17 00:00:00 2001 From: n0n4m3 Date: Thu, 17 Dec 2009 19:09:40 +0100 Subject: [PATCH] [9012] fix crash when achievement is completed and player isn't in world --HG-- branch : trunk --- src/game/AchievementMgr.cpp | 3 ++- src/game/LootHandler.cpp | 2 +- src/game/MiscHandler.cpp | 2 +- src/game/Object.cpp | 10 ++++++++++ src/game/Object.h | 2 ++ src/game/Spell.h | 4 ++-- 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 37fc507dd8..afd51d1f55 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -592,7 +592,8 @@ void AchievementMgr::SendAchievementEarned(AchievementEntry const* achievement) data << uint32(0); // 1=link supplied string as player name, 0=display plain string sWorld.SendGlobalMessage(&data); } - else + // if player is in world he can tell his friends about new achievement + else if (GetPlayer()->IsInWorld()) { CellPair p = MaNGOS::ComputeCellPair(GetPlayer()->GetPositionX(), GetPlayer()->GetPositionY()); diff --git a/src/game/LootHandler.cpp b/src/game/LootHandler.cpp index de464cf050..74b9730691 100644 --- a/src/game/LootHandler.cpp +++ b/src/game/LootHandler.cpp @@ -222,7 +222,7 @@ void WorldSession::HandleLootMoneyOpcode( WorldPacket & /*recv_data*/ ) Player* playerGroup = itr->getSource(); if(!playerGroup) continue; - if (player->IsWithinDist(playerGroup,sWorld.getConfig(CONFIG_GROUP_XP_DISTANCE),false)) + if (player->IsWithinDistInMap(playerGroup,sWorld.getConfig(CONFIG_GROUP_XP_DISTANCE),false)) playersNear.push_back(playerGroup); } diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index c843bd27fe..85e1a497a2 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -736,7 +736,7 @@ void WorldSession::HandleReclaimCorpseOpcode(WorldPacket &recv_data) if(corpse->GetGhostTime() + GetPlayer()->GetCorpseReclaimDelay(corpse->GetType()==CORPSE_RESURRECTABLE_PVP) > time(NULL)) return; - if (!corpse->IsWithinDist(GetPlayer(), CORPSE_RECLAIM_RADIUS, true)) + if (!corpse->IsWithinDistInMap(GetPlayer(), CORPSE_RECLAIM_RADIUS, true)) return; uint64 guid; diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 3e61910427..f3cff243e9 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -1398,6 +1398,16 @@ bool WorldObject::IsInBetween(const WorldObject *obj1, const WorldObject *obj2, return abs(sin(angle)) * GetExactDist2d(obj1->GetPositionX(), obj1->GetPositionY()) < size; } +bool WorldObject::isInFront(WorldObject const* target, float distance, float arc) const +{ + return IsWithinDist(target, distance) && HasInArc( arc, target ); +} + +bool WorldObject::isInBack(WorldObject const* target, float distance, float arc) const +{ + return IsWithinDist(target, distance) && !HasInArc( 2 * M_PI - arc, target ); +} + void WorldObject::GetRandomPoint(const Position &pos, float distance, float &rand_x, float &rand_y, float &rand_z) const { if(!distance) diff --git a/src/game/Object.h b/src/game/Object.h index cc876f1c75..83189f30b2 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -548,6 +548,8 @@ class TRINITY_DLL_SPEC WorldObject : public Object, public WorldLocation bool IsInRange(WorldObject const* obj, float minRange, float maxRange, bool is3D = true) const; bool IsInRange2d(float x, float y, float minRange, float maxRange) const; bool IsInRange3d(float x, float y, float z, float minRange, float maxRange) const; + bool isInFront(WorldObject const* target,float distance, float arc = M_PI) const; + bool isInBack(WorldObject const* target, float distance, float arc = M_PI) const; bool IsInBetween(const WorldObject *obj1, const WorldObject *obj2, float size = 0) const; diff --git a/src/game/Spell.h b/src/game/Spell.h index 2e12a909d9..dc64043803 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -734,11 +734,11 @@ namespace Trinity i_data->push_back(target); break; case PUSH_IN_FRONT: - if(i_source->isInFrontInMap(target, i_radius, M_PI/3)) + if(i_source->isInFront(target, i_radius, M_PI/3)) i_data->push_back(target); break; case PUSH_IN_BACK: - if(i_source->isInBackInMap(target, i_radius, M_PI/3)) + if(i_source->isInBack(target, i_radius, M_PI/3)) i_data->push_back(target); break; case PUSH_IN_LINE: