diff options
author | megamage <none@none.none> | 2011-10-10 17:59:52 -0400 |
---|---|---|
committer | megamage <none@none.none> | 2011-10-10 17:59:52 -0400 |
commit | 3569121d80d92a08ff64e6af0a79be95a8188634 (patch) | |
tree | 92632498fe5578222a4c4c3f37e88807bc588271 /src | |
parent | 3ba22d0d06ee52c6692d436fa013186cf6a6b9cf (diff) |
Remove/Add creature from/to map when it changes map.
Note: creatures was never supposed to change map, but now the core allows them to move with transports...
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Creature/Creature.cpp | 17 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 7 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.h | 1 |
3 files changed, 12 insertions, 13 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 5682e0c0361..fa12529d101 100755 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2387,22 +2387,15 @@ const char* Creature::GetNameForLocaleIdx(LocaleConstant loc_idx) const return GetName(); } -//TODO: This may cause crash. Creature must be removed from the original grid and added to the new grid. +//Do not if this works or not, moving creature to another map is very dangerous void Creature::FarTeleportTo(Map* map, float X, float Y, float Z, float O) { - InterruptNonMeleeSpells(true); - CombatStop(); - ClearComboPointHolders(); - DeleteThreatList(); - GetMotionMaster()->Clear(false); - DestroyForNearbyPlayers(); - - RemoveFromWorld(); + CleanupBeforeRemoveFromMap(false); + GetMap()->RemoveFromMap(this, false); ResetMap(); + Relocate(X, Y, Z, O); SetMap(map); - AddToWorld(); - - UpdatePosition(X, Y, Z, O, true); + GetMap()->AddToMap(this); } void Creature::SetPosition(float x, float y, float z, float o) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ba801354457..12c3992c980 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13710,7 +13710,7 @@ void Unit::RemoveFromWorld() } } -void Unit::CleanupsBeforeDelete(bool finalCleanup) +void Unit::CleanupBeforeRemoveFromMap(bool finalCleanup) { // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal InterruptNonMeleeSpells(true); @@ -13734,6 +13734,11 @@ void Unit::CleanupsBeforeDelete(bool finalCleanup) DeleteThreatList(); getHostileRefManager().setOnlineOfflineState(false); GetMotionMaster()->Clear(false); // remove different non-standard movement generators. +} + +void Unit::CleanupsBeforeDelete(bool finalCleanup) +{ + CleanupBeforeRemoveFromMap(finalCleanup); if (Creature* thisCreature = ToCreature()) if (GetTransport()) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index c683cbbe957..236f183e3b9 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1247,6 +1247,7 @@ class Unit : public WorldObject void AddToWorld(); void RemoveFromWorld(); + void CleanupBeforeRemoveFromMap(bool finalCleanup); void CleanupsBeforeDelete(bool finalCleanup = true); // used in ~Creature/~Player (or before mass creature delete to remove cross-references to already deleted units) DiminishingLevels GetDiminishing(DiminishingGroup group); |