Add teleporter panel and server-compatible coordinate conversions

Teleporter panel (T key) lets the player teleport between Goldshire,
Stormwind Gate, Ironforge, and Westfall in single-player mode. Adds
serverToCanonical/canonicalToServer conversion at the network packet
boundary so positions are compatible with TrinityCore/MaNGOS/AzerothCore
emulator servers.
This commit is contained in:
Kelsi 2026-02-04 18:27:52 -08:00
parent 6690910712
commit d8e2becbaa
8 changed files with 258 additions and 43 deletions

View file

@ -723,7 +723,7 @@ void TerrainManager::unloadTile(int x, int y) {
}
void TerrainManager::unloadAll() {
// Stop worker thread
// Stop worker threads
if (workerRunning.load()) {
workerRunning.store(false);
queueCV.notify_all();
@ -748,6 +748,10 @@ void TerrainManager::unloadAll() {
loadedTiles.clear();
failedTiles.clear();
// Reset tile tracking so streaming re-triggers at the new location
currentTile = {-1, -1};
lastStreamTile = {-1, -1};
// Clear terrain renderer
if (terrainRenderer) {
terrainRenderer->clear();
@ -757,6 +761,23 @@ void TerrainManager::unloadAll() {
if (waterRenderer) {
waterRenderer->clear();
}
// Clear WMO and M2 renderers so old-location geometry doesn't persist
if (wmoRenderer) {
wmoRenderer->clearInstances();
}
if (m2Renderer) {
m2Renderer->clear();
}
// Restart worker threads so streaming can resume
workerRunning.store(true);
unsigned hc = std::thread::hardware_concurrency();
workerCount = static_cast<int>(hc > 0 ? std::min(4u, std::max(2u, hc - 1)) : 2u);
workerThreads.reserve(workerCount);
for (int i = 0; i < workerCount; i++) {
workerThreads.emplace_back(&TerrainManager::workerLoop, this);
}
}
TileCoord TerrainManager::worldToTile(float glX, float glY) const {