From 3569121d80d92a08ff64e6af0a79be95a8188634 Mon Sep 17 00:00:00 2001 From: megamage Date: Mon, 10 Oct 2011 17:59:52 -0400 Subject: 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... --- src/server/game/Entities/Creature/Creature.cpp | 17 +++++------------ src/server/game/Entities/Unit/Unit.cpp | 7 ++++++- src/server/game/Entities/Unit/Unit.h | 1 + 3 files changed, 12 insertions(+), 13 deletions(-) (limited to 'src') 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); -- cgit v1.2.3