Fix taxi flight: camera panning, world reload, gryphon display, and animations

- Clear introActive/idleOrbit in externalFollow block so mouse panning works during taxi
- Skip full world reload on same-map teleports (taxi landing) by tracking loadedMapId
- Collect all model IDs for a path when resolving gryphon display ID (fixes displayId=0)
- Remove incorrect MountDisplayId fields from Vanilla/Turtle TaxiNodes DBC layouts
- Add Vanilla fly animation IDs (234/229/233) to taxi mount animation candidates
This commit is contained in:
Kelsi 2026-02-17 02:23:41 -08:00
parent 4a08271b75
commit 85714fd7f6
8 changed files with 85 additions and 19 deletions

View file

@ -1023,21 +1023,46 @@ void Renderer::updateCharacterAnimation() {
// Taxi flight: use flying animations instead of ground movement
if (taxiFlight_) {
// Prefer FlyForward, fall back to FlyIdle, then ANIM_RUN
if (characterRenderer->hasAnimation(mountInstanceId_, ANIM_FLY_FORWARD)) {
mountAnimId = ANIM_FLY_FORWARD;
} else if (characterRenderer->hasAnimation(mountInstanceId_, ANIM_FLY_IDLE)) {
mountAnimId = ANIM_FLY_IDLE;
} else {
mountAnimId = ANIM_RUN;
// Log available animations once when taxi starts
if (!taxiAnimsLogged_) {
taxiAnimsLogged_ = true;
LOG_INFO("Taxi flight active: mountInstanceId_=", mountInstanceId_,
" curMountAnim=", curMountAnim, " haveMountState=", haveMountState);
std::vector<pipeline::M2Sequence> seqs;
if (characterRenderer->getAnimationSequences(mountInstanceId_, seqs)) {
std::string animList;
for (const auto& s : seqs) {
if (!animList.empty()) animList += ", ";
animList += std::to_string(s.id);
}
LOG_INFO("Taxi mount available animations: [", animList, "]");
}
}
// Try multiple flying animation IDs in priority order:
// 159=FlyForward, 158=FlyIdle (WotLK flying mounts)
// 234=FlyRun, 229=FlyStand (Vanilla creature fly anims)
// 233=FlyWalk, 141=FlyMounted, 369=FlyRun (alternate IDs)
// 6=Fly (classic creature fly)
// Fallback: Run, then Stand (hover)
uint32_t flyAnims[] = {ANIM_FLY_FORWARD, ANIM_FLY_IDLE, 234, 229, 233, 141, 369, 6, ANIM_RUN};
mountAnimId = ANIM_STAND; // ultimate fallback: hover/idle
for (uint32_t fa : flyAnims) {
if (characterRenderer->hasAnimation(mountInstanceId_, fa)) {
mountAnimId = fa;
break;
}
}
if (!haveMountState || curMountAnim != mountAnimId) {
LOG_INFO("Taxi mount: playing animation ", mountAnimId);
characterRenderer->playAnimation(mountInstanceId_, mountAnimId, true);
}
// Skip all ground mount logic (jumps, fidgets, etc.)
goto taxi_mount_done;
} else {
taxiAnimsLogged_ = false;
}
// Check for jump trigger - use cached per-mount animation IDs