| 376 | } |
| 377 | |
| 378 | void Npc::update(float dt, uint64_t) { |
| 379 | if (!inWorld()) |
| 380 | return; |
| 381 | |
| 382 | m_movementController->setTimestep(dt); |
| 383 | |
| 384 | if (isMaster()) { |
| 385 | m_scriptComponent.update(m_scriptComponent.updateDt(dt)); |
| 386 | |
| 387 | if (inConflictingLoungeAnchor()) |
| 388 | m_movementController->resetAnchorState(); |
| 389 | |
| 390 | if (auto loungeAnchor = as<LoungeAnchor>(m_movementController->entityAnchor())) { |
| 391 | if (loungeAnchor->emote) |
| 392 | requestEmote(*loungeAnchor->emote); |
| 393 | m_statusController->setPersistentEffects("lounging", loungeAnchor->statusEffects); |
| 394 | m_effectEmitter->addEffectSources("normal", loungeAnchor->effectEmitters); |
| 395 | switch (loungeAnchor->orientation) { |
| 396 | case LoungeOrientation::Sit: |
| 397 | m_humanoid.setState(Humanoid::Sit); |
| 398 | break; |
| 399 | case LoungeOrientation::Lay: |
| 400 | m_humanoid.setState(Humanoid::Lay); |
| 401 | break; |
| 402 | case LoungeOrientation::Stand: |
| 403 | m_humanoid.setState(Humanoid::Idle); // currently the same as "standard" |
| 404 | // idle, but this is lounging idle |
| 405 | break; |
| 406 | default: |
| 407 | m_humanoid.setState(Humanoid::Idle); |
| 408 | } |
| 409 | } else { |
| 410 | m_statusController->setPersistentEffects("lounging", {}); |
| 411 | } |
| 412 | |
| 413 | m_armor->effects(*m_effectEmitter); |
| 414 | m_tools->effects(*m_effectEmitter); |
| 415 | |
| 416 | if (!m_disableWornArmor.get()) |
| 417 | m_statusController->setPersistentEffects("armor", m_armor->statusEffects()); |
| 418 | m_statusController->setPersistentEffects("tools", m_tools->statusEffects()); |
| 419 | |
| 420 | m_movementController->tickMaster(dt); |
| 421 | m_statusController->tickMaster(dt); |
| 422 | |
| 423 | tickShared(dt); |
| 424 | |
| 425 | if (!is<LoungeAnchor>(m_movementController->entityAnchor())) { |
| 426 | if (m_movementController->groundMovement()) { |
| 427 | if (m_movementController->running()) |
| 428 | m_humanoid.setState(Humanoid::Run); |
| 429 | else if (m_movementController->walking()) |
| 430 | m_humanoid.setState(Humanoid::Walk); |
| 431 | else if (m_movementController->crouching()) |
| 432 | m_humanoid.setState(Humanoid::Duck); |
| 433 | else |
| 434 | m_humanoid.setState(Humanoid::Idle); |
| 435 | } else if (m_movementController->liquidMovement()) { |
no test coverage detected