mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-06 00:53:52 +00:00
Disable mount idle sounds and relax fidget discovery
Idle sounds were too frequent/upsetting, and strict criteria found no fidgets. Changes: - Disabled idle sounds entirely (commented out in updateCharacterAnimation) - Relaxed fidget criteria: frequency OR replay (not both required) - Keeps proper metadata-based discovery (frequency/replay fields) - Comprehensive logging shows candidates and selections
This commit is contained in:
parent
4aa2b4f249
commit
8106347a82
1 changed files with 39 additions and 27 deletions
|
|
@ -713,27 +713,39 @@ void Renderer::setMounted(uint32_t mountInstId, uint32_t mountDisplayId, float h
|
||||||
mountAnims_.run = findFirst({5, 4}); // Run/Walk
|
mountAnims_.run = findFirst({5, 4}); // Run/Walk
|
||||||
mountAnims_.stand = findFirst({0}); // Stand (almost always 0)
|
mountAnims_.stand = findFirst({0}); // Stand (almost always 0)
|
||||||
|
|
||||||
// Discover idle fidget animations (head turn, tail swish, weight shift)
|
// Discover idle fidget animations using proper WoW M2 metadata (frequency, replay timers)
|
||||||
mountAnims_.fidgets.clear();
|
mountAnims_.fidgets.clear();
|
||||||
core::Logger::getInstance().info("Scanning for fidget animations in ", sequences.size(), " sequences");
|
core::Logger::getInstance().info("Scanning for fidget animations in ", sequences.size(), " sequences");
|
||||||
|
|
||||||
// Log ALL non-looping, short, stationary animations to help identify fidgets
|
// Proper fidget discovery: frequency > 0 + replay timers indicate random idle animations
|
||||||
for (const auto& seq : sequences) {
|
for (const auto& seq : sequences) {
|
||||||
bool isLoop = (seq.flags & 0x01) == 0;
|
bool isLoop = (seq.flags & 0x01) == 0;
|
||||||
if (!isLoop && seq.duration >= 400 && seq.duration <= 2000 && std::abs(seq.movingSpeed) < 0.05f) {
|
bool hasFrequency = seq.frequency > 0;
|
||||||
core::Logger::getInstance().info(" Candidate: id=", seq.id, " dur=", seq.duration, "ms speed=", seq.movingSpeed, " flags=0x", std::hex, seq.flags, std::dec);
|
bool hasReplay = seq.replayMax > 0;
|
||||||
}
|
bool isStationary = std::abs(seq.movingSpeed) < 0.05f;
|
||||||
}
|
bool reasonableDuration = seq.duration >= 400 && seq.duration <= 2500;
|
||||||
|
|
||||||
|
// Log candidates with metadata
|
||||||
|
if (!isLoop && reasonableDuration && isStationary && (hasFrequency || hasReplay)) {
|
||||||
|
core::Logger::getInstance().info(" Candidate: id=", seq.id,
|
||||||
|
" dur=", seq.duration, "ms",
|
||||||
|
" freq=", seq.frequency,
|
||||||
|
" replay=", seq.replayMin, "-", seq.replayMax,
|
||||||
|
" next=", seq.nextAnimation,
|
||||||
|
" speed=", seq.movingSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select fidgets: non-looping + (frequency OR replay) + stationary
|
||||||
|
// Relaxed: some mounts may only have one of the markers
|
||||||
|
if (!isLoop && (hasFrequency || hasReplay) && isStationary && reasonableDuration) {
|
||||||
|
// Bonus: chains back to stand (indicates idle behavior)
|
||||||
|
bool chainsToStand = (seq.nextAnimation == (int16_t)mountAnims_.stand) ||
|
||||||
|
(seq.aliasNext == mountAnims_.stand) ||
|
||||||
|
(seq.nextAnimation == -1);
|
||||||
|
|
||||||
// Conservative selection: very short, very stationary, exclude known combat IDs
|
|
||||||
for (const auto& seq : sequences) {
|
|
||||||
bool isLoop = (seq.flags & 0x01) == 0;
|
|
||||||
// Strict: 500-1200ms, nearly stationary, exclude combat range (16-21) and specials (2-3)
|
|
||||||
if (!isLoop && seq.duration >= 500 && seq.duration <= 1200 &&
|
|
||||||
std::abs(seq.movingSpeed) < 0.01f &&
|
|
||||||
seq.id != 2 && seq.id != 3 && (seq.id < 16 || seq.id > 21)) {
|
|
||||||
mountAnims_.fidgets.push_back(seq.id);
|
mountAnims_.fidgets.push_back(seq.id);
|
||||||
core::Logger::getInstance().info(" >> Selected fidget: id=", seq.id);
|
core::Logger::getInstance().info(" >> Selected fidget: id=", seq.id,
|
||||||
|
(chainsToStand ? " (chains to stand)" : ""));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1090,19 +1102,19 @@ void Renderer::updateCharacterAnimation() {
|
||||||
mountActiveFidget_ = 0; // Cancel any active fidget
|
mountActiveFidget_ = 0; // Cancel any active fidget
|
||||||
}
|
}
|
||||||
|
|
||||||
// Idle ambient sounds: random snorts/stomps/breaths when standing still
|
// Idle ambient sounds: DISABLED for now (too frequent/annoying)
|
||||||
if (!moving && mountSoundManager) {
|
// if (!moving && mountSoundManager) {
|
||||||
mountIdleSoundTimer_ += lastDeltaTime_;
|
// mountIdleSoundTimer_ += lastDeltaTime_;
|
||||||
static float nextIdleSoundTime = 8.0f + (rand() % 8); // 8-15 seconds
|
// static float nextIdleSoundTime = 8.0f + (rand() % 8); // 8-15 seconds
|
||||||
|
//
|
||||||
if (mountIdleSoundTimer_ >= nextIdleSoundTime) {
|
// if (mountIdleSoundTimer_ >= nextIdleSoundTime) {
|
||||||
mountSoundManager->playIdleSound();
|
// mountSoundManager->playIdleSound();
|
||||||
mountIdleSoundTimer_ = 0.0f;
|
// mountIdleSoundTimer_ = 0.0f;
|
||||||
nextIdleSoundTime = 8.0f + (rand() % 8); // Randomize next sound time
|
// nextIdleSoundTime = 8.0f + (rand() % 8); // Randomize next sound time
|
||||||
}
|
// }
|
||||||
} else if (moving) {
|
// } else if (moving) {
|
||||||
mountIdleSoundTimer_ = 0.0f; // Reset timer when moving
|
// mountIdleSoundTimer_ = 0.0f; // Reset timer when moving
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Only update animation if it changed and we're not in an action sequence or playing a fidget
|
// Only update animation if it changed and we're not in an action sequence or playing a fidget
|
||||||
if (mountAction_ == MountAction::None && mountActiveFidget_ == 0 && (!haveMountState || curMountAnim != mountAnimId)) {
|
if (mountAction_ == MountAction::None && mountActiveFidget_ == 0 && (!haveMountState || curMountAnim != mountAnimId)) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue