aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQAston <qaston@gmail.com>2011-09-14 14:27:21 -0700
committerQAston <qaston@gmail.com>2011-09-14 14:27:21 -0700
commitdecb20f079e66ebe91ddd06ecbed1bb427fecbf0 (patch)
tree442cc316016ada6a693c96f48eedc05c1ea902a2
parentbca9545fbe2b68dc7d1acbb87f6270bf35eb4edb (diff)
parent76488854d8e59e66ae2e7389d8ec72d014ff4eb4 (diff)
Merge pull request #2991 from megamage/master
Core/Entities: Do not call AddObjectToRemoveList(Pet*) in Map::MoveAllCreaturesInMoveList() - Closes #2892. Scripts: Fix a crash in npc_brunnhildar_prisoner script. Closes #2825.
-rwxr-xr-xsrc/server/game/Maps/Map.cpp15
-rw-r--r--src/server/scripts/Northrend/storm_peaks.cpp28
2 files changed, 35 insertions, 8 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 001f22815b5..3bba445b99e 100755
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -832,7 +832,16 @@ void Map::MoveAllCreaturesInMoveList()
#ifdef TRINITY_DEBUG
sLog->outDebug(LOG_FILTER_MAPS, "Creature (GUID: %u Entry: %u) cannot be move to unloaded respawn grid.", c->GetGUIDLow(), c->GetEntry());
#endif
- AddObjectToRemoveList(c);
+ //AddObjectToRemoveList(Pet*) should only be called in Pet::Remove
+ //This may happen when a player just logs in and a pet moves to a nearby unloaded cell
+ //To avoid this, we can load nearby cells when player log in
+ //But this check is always needed to ensure safety
+ //TODO: pets will disappear if this is outside CreatureRespawnRelocation
+ //need to check why pet is frequently relocated to an unloaded cell
+ if (c->isPet())
+ ((Pet*)c)->Remove(PET_SAVE_NOT_IN_SLOT, true);
+ else
+ AddObjectToRemoveList(c);
}
}
@@ -925,8 +934,8 @@ bool Map::CreatureRespawnRelocation(Creature *c)
c->UpdateObjectVisibility(false);
return true;
}
- else
- return false;
+
+ return false;
}
bool Map::UnloadGrid(const uint32 x, const uint32 y, bool unloadAll)
diff --git a/src/server/scripts/Northrend/storm_peaks.cpp b/src/server/scripts/Northrend/storm_peaks.cpp
index 0fedf101a9c..081f8fb1479 100644
--- a/src/server/scripts/Northrend/storm_peaks.cpp
+++ b/src/server/scripts/Northrend/storm_peaks.cpp
@@ -558,7 +558,7 @@ public:
{
npc_brunnhildar_prisonerAI(Creature* creature) : ScriptedAI(creature) {}
- Unit* drake;
+ uint64 drakeGUID;
uint16 enter_timer;
bool hasEmptySeats;
@@ -566,14 +566,25 @@ public:
{
me->CastSpell(me, SPELL_ICE_PRISON, true);
enter_timer = 0;
- drake = NULL;
+ drakeGUID = 0;
hasEmptySeats = false;
}
void UpdateAI(const uint32 diff)
{
+ //TODO: not good script
+ if (!drakeGUID)
+ return;
+
+ Creature* drake = Unit::GetCreature(*me, drakeGUID);
+ if (!drake)
+ {
+ drakeGUID = 0;
+ return;
+ }
+
// drake unsummoned, passengers dropped
- if (drake && !me->IsOnVehicle(drake) && !hasEmptySeats)
+ if (!me->IsOnVehicle(drake) && !hasEmptySeats)
me->ForcedDespawn(3000);
if (enter_timer <= 0)
@@ -593,9 +604,16 @@ public:
void MoveInLineOfSight(Unit* unit)
{
- if (!unit || !drake)
+ if (!unit || !drakeGUID)
return;
+ Creature* drake = Unit::GetCreature(*me, drakeGUID);
+ if (!drake)
+ {
+ drakeGUID = 0;
+ return;
+ }
+
if (!me->IsOnVehicle(drake) && !me->HasAura(SPELL_ICE_PRISON))
{
if (unit->IsVehicle() && me->IsWithinDist(unit, 25.0f, true) && unit->ToCreature() && unit->ToCreature()->GetEntry() == 29709)
@@ -651,7 +669,7 @@ public:
enter_timer = 500;
if (hitter->IsVehicle())
- drake = hitter;
+ drakeGUID = hitter->GetGUID();
else
return;