Fix mount sounds, grey WMO meshes, taxi landing, tree animations, and classic dismount

- Per-family mount sounds (kodo, tallstrider, mechanostrider, etc.) detected from M2 model path
- Skip WMO groups with SHOW_SKYBOX flag or all-untextured batches (grey mesh in Orgrimmar)
- Freeze physics during taxi landing until terrain loads to prevent falling through void
- Disable bone animations on tropical vegetation (palm, bamboo, banana, etc.) to fix wiggling
- Snap player to final taxi waypoint on flight completion
- Extract mount aura spell ID from classic UNIT_FIELD_AURAS for CMSG_CANCEL_AURA dismount
- Increase /unstuck forward nudge to 5 units
This commit is contained in:
Kelsi 2026-02-14 21:04:20 -08:00
parent bf31da8c13
commit d27387d744
13 changed files with 525 additions and 217 deletions

View file

@ -3,6 +3,7 @@
#include <string>
#include <cstdint>
#include <vector>
#include <unordered_map>
#include <chrono>
namespace wowee {
@ -24,7 +25,15 @@ enum class MountFamily {
WOLF,
TIGER,
RAPTOR,
DRAGON
DRAGON,
KODO,
MECHANOSTRIDER,
TALLSTRIDER,
UNDEAD_HORSE
};
struct MountFamilyHash {
std::size_t operator()(MountFamily f) const { return static_cast<std::size_t>(f); }
};
struct MountSample {
@ -42,7 +51,7 @@ public:
void update(float deltaTime);
// Called when mounting/dismounting
void onMount(uint32_t creatureDisplayId, bool isFlying);
void onMount(uint32_t creatureDisplayId, bool isFlying, const std::string& modelPath = "");
void onDismount();
// Update movement state
@ -63,6 +72,7 @@ public:
private:
MountType detectMountType(uint32_t creatureDisplayId) const;
MountFamily detectMountFamily(uint32_t creatureDisplayId) const;
MountFamily detectMountFamilyFromPath(const std::string& modelPath) const;
void updateMountSounds();
void stopAllMountSounds();
void loadMountSounds();
@ -80,11 +90,18 @@ private:
// Mount sound samples (loaded from MPQ)
std::vector<MountSample> wingFlapSounds_;
std::vector<MountSample> wingIdleSounds_;
std::vector<MountSample> horseBreathSounds_;
std::vector<MountSample> horseMoveSounds_;
std::vector<MountSample> horseJumpSounds_; // Jump effort sounds
std::vector<MountSample> horseLandSounds_; // Landing thud sounds
std::vector<MountSample> horseIdleSounds_; // Snorts and whinnies for idle
// Per-family ground mount sounds
struct FamilySounds {
std::vector<MountSample> move; // Movement ambient (alerts/whinnies/growls)
std::vector<MountSample> jump; // Jump effort sounds
std::vector<MountSample> land; // Landing wound/thud sounds
std::vector<MountSample> idle; // Idle ambient (snorts/breathing/fidgets)
};
std::unordered_map<MountFamily, FamilySounds, MountFamilyHash> familySounds_;
// Helper to get sounds for current family (falls back to HORSE)
const FamilySounds& getCurrentFamilySounds() const;
// Sound state tracking
bool playingMovementSound_ = false;