diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Maps/Map.cpp | 15 | ||||
-rw-r--r-- | src/server/scripts/Northrend/storm_peaks.cpp | 28 |
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; |