void TransportMgr::SpawnContinentTransports() { if (_transportTemplates.empty()) return; uint32 oldMSTime = getMSTime(); QueryResult result = WorldDatabase.Query("SELECT guid, entry FROM transports"); uint32 count = 0; if (result) { do { Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); uint32 entry = fields[1].GetUInt32(); if (TransportTemplate const* tInfo = GetTransportTemplate(entry)) if (!tInfo->inInstance) if (CreateTransport(entry, guid)) ++count; } while (result->NextRow()); } TC_LOG_INFO("server.loading", ">> Spawned %u continent transports in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); }
Transport* TransportMgr::CreateTransport(uint32 entry, uint32 guid /*= 0*/, Map* map /*= NULL*/) { // instance case, execute GetGameObjectEntry hook if (map) { // SetZoneScript() is called after adding to map, so fetch the script using map if (map->IsDungeon()) if (InstanceScript* instance = static_cast<InstanceMap*>(map)->GetInstanceScript()) entry = instance->GetGameObjectEntry(0, entry); if (!entry) return NULL; } TransportTemplate const* tInfo = GetTransportTemplate(entry); if (!tInfo) { TC_LOG_ERROR("sql.sql", "Transport %u will not be loaded, `transport_template` missing", entry); return NULL; } // create transport... Transport* trans = new Transport(); // ...at first waypoint TaxiPathNodeEntry const* startNode = tInfo->keyFrames.begin()->Node; uint32 mapId = startNode->mapid; float x = startNode->x; float y = startNode->y; float z = startNode->z; float o = 0.0f; // initialize the gameobject base uint32 guidLow = guid ? guid : sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT); if (!trans->Create(guidLow, entry, mapId, x, y, z, o, 255)) { delete trans; return NULL; } if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId)) { if (mapEntry->Instanceable() != tInfo->inInstance) { TC_LOG_ERROR("entities.transport", "Transport %u (name: %s) attempted creation in instance map (id: %u) but it is not an instanced transport!", entry, trans->GetName().c_str(), mapId); delete trans; return NULL; } } // use preset map for instances (need to know which instance) trans->SetMap(map ? map : sMapMgr->CreateMap(mapId, NULL)); if (map && map->IsDungeon()) trans->m_zoneScript = map->ToInstanceMap()->GetInstanceScript(); // Passengers will be loaded once a player is near trans->GetMap()->AddToMap<Transport>(trans); return trans; }
void TransportMgr::SpawnContinentTransports() { if (_transportTemplates.empty()) return; uint32 oldMSTime = getMSTime(); QueryResult result = WorldDatabase.Query("SELECT guid, entry FROM transports"); uint32 count = 0; if (result) { do { Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); uint32 entry = fields[1].GetUInt32(); if (TransportTemplate const* tInfo = GetTransportTemplate(entry)) if (!tInfo->inInstance) if (CreateTransport(entry, guid)) ++count; } while (result->NextRow()); } sLog->outString(">> Spawned %u continent motion transports in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); // pussywizard: preload grids for continent static transports oldMSTime = getMSTime(); result = WorldDatabase.Query("SELECT map, position_x, position_y FROM gameobject g JOIN gameobject_template t ON g.id = t.entry WHERE t.type = 11"); count = 0; if (result) { do { Field* fields = result->Fetch(); uint32 mapId = fields[0].GetUInt32(); float x = fields[1].GetFloat(); float y = fields[2].GetFloat(); MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); if (mapEntry && !mapEntry->Instanceable()) if (Map* map = sMapMgr->CreateBaseMap(mapId)) { map->LoadGrid(x, y); ++count; } } while (result->NextRow()); } sLog->outString(">> Preloaded grids for %u continent static transports in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); }
Transport* TransportMgr::CreateTransport(uint32 entry, ObjectGuid::LowType guid /*= 0*/, Map* map /*= NULL*/, uint32 phaseid /*= 0*/, uint32 phasegroup /*= 0*/) { // instance case, execute GetGameObjectEntry hook if (map) { // SetZoneScript() is called after adding to map, so fetch the script using map if (map->IsDungeon()) if (InstanceScript* instance = static_cast<InstanceMap*>(map)->GetInstanceScript()) entry = instance->GetGameObjectEntry(0, entry); if (!entry) return NULL; } TransportTemplate const* tInfo = GetTransportTemplate(entry); if (!tInfo) { TC_LOG_ERROR("sql.sql", "Transport %u will not be loaded, `transport_template` missing", entry); return NULL; } // create transport... Transport* trans = new Transport(); // ...at first waypoint TaxiPathNodeEntry const* startNode = tInfo->keyFrames.begin()->Node; uint32 mapId = startNode->MapID; float x = startNode->LocX; float y = startNode->LocY; float z = startNode->LocZ; float o = tInfo->keyFrames.begin()->InitialOrientation; // initialize the gameobject base ObjectGuid::LowType guidLow = guid ? guid : sObjectMgr->GetGenerator<HighGuid::Mo_Transport>().Generate(); if (!trans->Create(guidLow, entry, mapId, x, y, z, o, 255)) { delete trans; return NULL; } if (phaseid) trans->SetInPhase(phaseid, false, true); if (phasegroup) for (auto ph : GetPhasesForGroup(phasegroup)) trans->SetInPhase(ph, false, true); if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId)) { if (mapEntry->Instanceable() != tInfo->inInstance) { TC_LOG_ERROR("entities.transport", "Transport %u (name: %s) attempted creation in instance map (id: %u) but it is not an instanced transport!", entry, trans->GetName().c_str(), mapId); delete trans; return NULL; } } // use preset map for instances (need to know which instance) trans->SetMap(map ? map : sMapMgr->CreateMap(mapId, NULL)); if (map && map->IsDungeon()) trans->m_zoneScript = map->ToInstanceMap()->GetInstanceScript(); // Passengers will be loaded once a player is near HashMapHolder<Transport>::Insert(trans); HashMapHolder<Transport>::Insert(trans); trans->GetMap()->AddToMap<Transport>(trans); return trans; }
Transport* TransportMgr::CreateTransport(uint32 entry, Map* map /*= NULL*/) { // instance case, execute GetGameObjectEntry hook if (map) { // SetZoneScript() is called after adding to map, so fetch the script using map if (map->IsDungeon()) if (InstanceScript* instance = static_cast<InstanceMap*>(map)->GetInstanceScript()) entry = instance->GetGameObjectEntry(0, entry); if (!entry) return NULL; } TransportTemplate const* tInfo = GetTransportTemplate(entry); if (!tInfo) { sLog->outErrorDb("Transport %u will not be loaded, `transport_template` missing", entry); return NULL; } // create transport... Transport* trans = new Transport(); // ...at first waypoint TaxiPathNodeEntry const* startNode = tInfo->keyFrames.begin()->node; uint32 mapId = startNode->mapid; float x = startNode->x; float y = startNode->y; float z = startNode->z; float o = 1.0f; // initialize the gameobject base if (!trans->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_MO_TRANSPORT), entry, mapId, x, y, z, o, 100, 0)) { delete trans; return NULL; } if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId)) { if (uint32(mapEntry->Instanceable()) != trans->GetGOInfo()->moTransport.inInstance) { sLog->outError("Transport %u (name: %s) attempted creation in instance map (id: %u) but it is not an instanced transport!", entry, trans->GetName(), mapId); delete trans; return NULL; } } // use preset map for instances (need to know which instance) trans->SetMap(map ? map : sMapMgr->CreateMap(mapId, trans, 0)); trans->SetZoneScript(); // Get all spawns on Transport map if (uint32 mapId = trans->GetGOInfo()->moTransport.mapID) { CellObjectGuidsMap const& cells = sObjectMgr->GetMapObjectGuids(mapId, REGULAR_DIFFICULTY); CellGuidSet::const_iterator guidEnd; for (CellObjectGuidsMap::const_iterator cellItr = cells.begin(); cellItr != cells.end(); ++cellItr) { // Creatures on transport guidEnd = cellItr->second.creatures.end(); for (CellGuidSet::const_iterator guidItr = cellItr->second.creatures.begin(); guidItr != guidEnd; ++guidItr) { CreatureData const* data = sObjectMgr->GetCreatureData(*guidItr); trans->CreateNPCPassenger(data->id, data->posX, data->posY, data->posZ, data->orientation, data); } // GameObjects on transport } } // register in container for updates _transportUpdates.insert(trans); // and in container designed for quicker access by mapId for (std::set<uint32>::const_iterator i = tInfo->mapsUsed.begin(); i != tInfo->mapsUsed.end(); ++i) _transportMap[*i].insert(trans); trans->AddToWorld(); if (map) trans->UpdateForMap(map); return trans; }