| 364 | } |
| 365 | |
| 366 | void ToolUser::tick(float dt, bool shifting, HashSet<MoveControlType> const& moves) { |
| 367 | if (auto toolUserItem = as<ToolUserItem>(m_primaryHandItem.get())) { |
| 368 | FireMode fireMode = FireMode::None; |
| 369 | if (!m_suppress.get()) { |
| 370 | if (m_fireMain) |
| 371 | fireMode = FireMode::Primary; |
| 372 | else if (m_fireAlt && m_primaryHandItem.get()->twoHanded()) |
| 373 | fireMode = FireMode::Alt; |
| 374 | } |
| 375 | toolUserItem->update(dt, fireMode, shifting, moves); |
| 376 | } |
| 377 | |
| 378 | if (!m_primaryHandItem.get() || !m_primaryHandItem.get()->twoHanded()) { |
| 379 | if (auto toolUserItem = as<ToolUserItem>(m_altHandItem.get())) { |
| 380 | FireMode fireMode = FireMode::None; |
| 381 | if (!m_suppress.get() && m_fireAlt) |
| 382 | fireMode = FireMode::Primary; |
| 383 | toolUserItem->update(dt, fireMode, shifting, moves); |
| 384 | } |
| 385 | } |
| 386 | |
| 387 | bool edgeTriggeredMain = m_edgeTriggeredMain; |
| 388 | m_edgeTriggeredMain = false; |
| 389 | bool edgeTriggeredAlt = m_edgeTriggeredAlt; |
| 390 | m_edgeTriggeredAlt = false; |
| 391 | |
| 392 | bool edgeSuppressedMain = m_edgeSuppressedMain; |
| 393 | m_edgeSuppressedMain = false; |
| 394 | bool edgeSuppressedAlt = m_edgeSuppressedAlt; |
| 395 | m_edgeSuppressedAlt = false; |
| 396 | |
| 397 | if (!m_suppress.get()) { |
| 398 | if (itemSafeTwoHanded(m_primaryHandItem.get()) && (m_fireMain || m_fireAlt)) { |
| 399 | FireableItemPtr fireableItem = as<FireableItem>(m_primaryHandItem.get()); |
| 400 | if (fireableItem) { |
| 401 | FireMode mode; |
| 402 | if (m_fireMain) |
| 403 | mode = FireMode::Primary; |
| 404 | else |
| 405 | mode = FireMode::Alt; |
| 406 | fireableItem->fire(mode, shifting, edgeTriggeredMain || edgeTriggeredAlt); |
| 407 | } |
| 408 | ActivatableItemPtr activatableItem = as<ActivatableItem>(m_primaryHandItem.get()); |
| 409 | if (activatableItem && activatableItem->usable()) |
| 410 | activatableItem->activate(); |
| 411 | } else if (edgeSuppressedMain || (itemSafeTwoHanded(m_primaryHandItem.get()) && edgeSuppressedAlt)) { |
| 412 | FireableItemPtr fireableItem = as<FireableItem>(m_primaryHandItem.get()); |
| 413 | if (fireableItem) { |
| 414 | FireMode mode = FireMode::Primary; |
| 415 | fireableItem->endFire(mode, shifting); |
| 416 | } |
| 417 | |
| 418 | if (m_fireAlt) { |
| 419 | FireableItemPtr fireableItem = as<FireableItem>(m_altHandItem.get()); |
| 420 | if (fireableItem) |
| 421 | fireableItem->fire(FireMode::Alt, shifting, edgeTriggeredAlt); |
| 422 | ActivatableItemPtr activatableItem = as<ActivatableItem>(m_altHandItem.get()); |
| 423 | if (activatableItem && activatableItem->usable()) |