void Garrison::Plot::DeleteGameObject(Map* map) { if (BuildingInfo.Guid.IsEmpty()) return; for (ObjectGuid const& guid : BuildingInfo.Spawns) { WorldObject* object = nullptr; switch (guid.GetHigh()) { case HighGuid::Creature: object = map->GetCreature(guid); break; case HighGuid::GameObject: object = map->GetGameObject(guid); break; default: continue; } if (object) object->AddObjectToRemoveList(); } BuildingInfo.Spawns.clear(); if (GameObject* oldBuilding = map->GetGameObject(BuildingInfo.Guid)) oldBuilding->Delete(); BuildingInfo.Guid.Clear(); }
void Transport::UnloadStaticPassengers() { while (!_staticPassengers.empty()) { WorldObject* obj = *_staticPassengers.begin(); obj->AddObjectToRemoveList(); // also removes from _staticPassengers } }
void Transport::DelayedTeleportTransport() { if (!_delayedTeleport) return; _delayedTeleport = false; Map* newMap = sMapMgr->CreateBaseMap(_nextFrame->Node->ContinentID); GetMap()->RemoveFromMap<Transport>(this, false); SetMap(newMap); float x = _nextFrame->Node->Loc.X, y = _nextFrame->Node->Loc.Y, z = _nextFrame->Node->Loc.Z, o =_nextFrame->InitialOrientation; for (_passengerTeleportItr = _passengers.begin(); _passengerTeleportItr != _passengers.end();) { WorldObject* obj = (*_passengerTeleportItr++); float destX, destY, destZ, destO; obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO); TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o); switch (obj->GetTypeId()) { case TYPEID_PLAYER: if (!obj->ToPlayer()->TeleportTo(_nextFrame->Node->ContinentID, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT)) RemovePassenger(obj); break; case TYPEID_DYNAMICOBJECT: case TYPEID_AREATRIGGER: obj->AddObjectToRemoveList(); break; default: RemovePassenger(obj); break; } } Relocate(x, y, z, o); GetMap()->AddToMap<Transport>(this); }
bool Transport::TeleportTransport(uint32 newMapid, float x, float y, float z, float o) { Map const* oldMap = GetMap(); if (oldMap->GetId() != newMapid) { Map* newMap = sMapMgr->CreateBaseMap(newMapid); UnloadStaticPassengers(); GetMap()->RemoveFromMap<Transport>(this, false); SetMap(newMap); for (std::set<WorldObject*>::iterator itr = _passengers.begin(); itr != _passengers.end();) { WorldObject* obj = (*itr++); float destX, destY, destZ, destO; obj->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO); TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o); switch (obj->GetTypeId()) { case TYPEID_UNIT: if (!IS_PLAYER_GUID(obj->ToUnit()->GetOwnerGUID())) // pets should be teleported with player obj->ToCreature()->FarTeleportTo(newMap, destX, destY, destZ, destO); break; case TYPEID_GAMEOBJECT: { GameObject* go = obj->ToGameObject(); go->GetMap()->RemoveFromMap(go, false); go->Relocate(destX, destY, destZ, destO); go->SetMap(newMap); newMap->AddToMap(go); break; } case TYPEID_PLAYER: if (!obj->ToPlayer()->TeleportTo(newMapid, destX, destY, destZ, destO, TELE_TO_NOT_LEAVE_TRANSPORT)) _passengers.erase(obj); break; case TYPEID_DYNAMICOBJECT: obj->AddObjectToRemoveList(); break; default: break; } } Relocate(x, y, z, o); UpdateModelPosition(); GetMap()->AddToMap<Transport>(this); return true; } else { // Teleport players, they need to know it for (std::set<WorldObject*>::iterator itr = _passengers.begin(); itr != _passengers.end(); ++itr) { if ((*itr)->GetTypeId() == TYPEID_PLAYER) { float destX, destY, destZ, destO; (*itr)->m_movementInfo.transport.pos.GetPosition(destX, destY, destZ, destO); TransportBase::CalculatePassengerPosition(destX, destY, destZ, &destO, x, y, z, o); (*itr)->ToUnit()->NearTeleportTo(destX, destY, destZ, destO); } } UpdatePosition(x, y, z, o); return false; } }