aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none.none>2011-10-10 17:59:52 -0400
committermegamage <none@none.none>2011-10-10 17:59:52 -0400
commit3569121d80d92a08ff64e6af0a79be95a8188634 (patch)
tree92632498fe5578222a4c4c3f37e88807bc588271 /src
parent3ba22d0d06ee52c6692d436fa013186cf6a6b9cf (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-xsrc/server/game/Entities/Creature/Creature.cpp17
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp7
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h1
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);