void ClusterInterface::HandleTransporterMapChange(WorldPacket & pck) { //remove when this is stable, ROFL DEBUG_LOG("Transport", "Handling clustered map change"); uint32 tentry, mapid; float x, y, z; pck >> tentry >> mapid >> x >> y >> z; Transporter* t = objmgr.GetTransporterByEntry(tentry); //we need to add to our map MapMgr* mgr = sInstanceMgr.GetMapMgr(mapid); LocationVector l; l.x = x; l.y = y; l.z = z; if (mgr == NULL) return; if (t->IsInWorld()) t->RemoveFromWorld(false); t->SetMapId(mapid); //don't start instantly, we start after eventclustermapchange is finished :P sEventMgr.RemoveEvents(t); //t->m_canmove = false; t->AddToWorld(mgr); sEventMgr.AddEvent(t, &Transporter::EventClusterMapChange, mapid, l, EVENT_UNK, 1, 1, EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT | EVENT_FLAG_MOVE_TO_WORLD_CONTEXT); }
Transporter* ObjectMgr::LoadTransportInInstance(MapMgr *instance, uint32 goEntry, uint32 period) { auto gameobject_info = sMySQLStore.getGameObjectProperties(goEntry); if (gameobject_info == nullptr) { LOG_ERROR("Transport ID:%u, will not be loaded, gameobject_properties missing", goEntry); return NULL; } if (gameobject_info->type != GAMEOBJECT_TYPE_MO_TRANSPORT) { LOG_ERROR("Transport ID:%u, Name: %s, will not be loaded, gameobject_properties type wrong", goEntry, gameobject_info->name.c_str()); return NULL; } std::set<uint32> mapsUsed; Transporter* t = new Transporter((uint64)HIGHGUID_TYPE_TRANSPORTER << 32 | goEntry); // Generate waypoints if (!t->GenerateWaypoints(gameobject_info->mo_transport.taxi_path_id)) { LOG_ERROR("Transport ID:%u, Name: %s, failed to create waypoints", gameobject_info->entry, gameobject_info->name.c_str()); delete t; return NULL; } // Create Transporter if (!t->Create(goEntry, period)) { delete t; return NULL; } m_Transporters.insert(t); m_TransportersByInstanceIdMap[instance->GetInstanceID()].insert(t); AddTransport(t); // AddObject To World t->AddToWorld(instance); // correct incorrect instance id's t->SetInstanceID(instance->GetInstanceID()); t->SetMapId(t->GetMapId()); t->BuildStartMovePacket(instance); t->BuildStopMovePacket(instance); t->m_WayPoints.clear(); // Make transport stopped at server-side, movement will be handled by scripts LogDetail("Transport Handler : Spawned Transport Entry %u, map %u, instance id %u", goEntry, t->GetMapId(), t->GetInstanceID()); return t; }
void ObjectMgr::LoadTransports() { LogNotice("TransportHandler : Start creating transports..."); { uint32_t createCount = 0; for (auto it : sMySQLStore._transportDataStore) { GameObjectProperties const* gameobject_info = sMySQLStore.getGameObjectProperties(it.first); std::set<uint32> mapsUsed; Transporter* pTransporter = new Transporter((uint64)HIGHGUID_TYPE_TRANSPORTER << 32 | it.first); if (pTransporter->GenerateWaypoints(gameobject_info->mo_transport.taxi_path_id) == false) { LOG_ERROR("Transport entry: %u, failed to create waypoints", it.first); delete pTransporter; continue; } if (pTransporter->Create(it.first, it.second.period) == false) { delete pTransporter; continue; } pTransporter->AddToWorld(); m_Transporters.insert(pTransporter); AddTransport(pTransporter); for (std::set<uint32>::const_iterator i = mapsUsed.begin(); i != mapsUsed.end(); ++i) { m_TransportersByMap[*i].insert(pTransporter); } ++createCount; } LogDetail("Transporter Handler : Created %u transports", createCount); } LogNotice("TransportHandler : Start populating transports with creatures..."); { for (auto it : sMySQLStore._transportCreaturesStore) { for (ObjectMgr::TransporterSet::iterator itr = m_Transporters.begin(); itr != m_Transporters.end(); ++itr) { if ((*itr)->getEntry() == it.second.transportEntry) { TransportSpawn spawn{ it.second.guid, it.second.entry, it.second.transportEntry, it.second.transportOffsetX, it.second.transportOffsetY, it.second.transportOffsetZ, it.second.transportOffsetO, it.second.animation }; (*itr)->AddCreature(spawn); break; } } } for (auto transport : m_Transporters) { transport->RespawnCreaturePassengers(); } } }