diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2021-03-04 10:09:35 +0100 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2021-03-05 09:45:58 +0100 |
commit | 2fd31f525e28f88ef84179be4735da5115a0a0ee (patch) | |
tree | 3ee4a7aa91e8fd1c074bfdf90b948478eddc73e1 /src/client | |
parent | 0d94a5e581d8338cb02af8a250623617f1cb6b7d (diff) | |
download | minetest-wield_animation.tar.xz |
Different animations for different actionswield_animation
Diffstat (limited to 'src/client')
-rw-r--r-- | src/client/camera.cpp | 96 | ||||
-rw-r--r-- | src/client/camera.h | 7 | ||||
-rw-r--r-- | src/client/game.cpp | 1 |
3 files changed, 66 insertions, 38 deletions
diff --git a/src/client/camera.cpp b/src/client/camera.cpp index c359f3365..6c973c870 100644 --- a/src/client/camera.cpp +++ b/src/client/camera.cpp @@ -177,9 +177,12 @@ void Camera::step(f32 dtime) if (m_wield_change_timer >= 0 && was_under_zero) { m_wieldnode->setItem(m_wield_item_next, m_client); - m_wield_animation = m_wield_item_next - .getDefinition(m_client->getItemDefManager()) - .wield_animation; + const ItemDefinition def = m_wield_item_next + .getDefinition(m_client->getItemDefManager()); + m_wield_animation_base = def.wield_animation_base; + m_wield_animation_dig = def.wield_animation_dig; + m_wield_animation_place = def.wield_animation_place; + m_wield_animation_activate = def.wield_animation_activate; } if (m_view_bobbing_state != 0) @@ -222,23 +225,21 @@ void Camera::step(f32 dtime) } } - if (m_digging_button != -1) { - float m_digging_anim_was = m_digging_anim; - m_digging_anim += dtime; - const WieldAnimation &wield_anim = WieldAnimation::getNamed(m_wield_animation); - if (m_digging_anim >= wield_anim.getDuration()) - { - m_digging_anim = 0; - m_digging_button = -1; - } - float lim = 0.05f; - if(m_digging_anim_was < lim && m_digging_anim >= lim) - { - if (m_digging_button == 0) { - m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::CAMERA_PUNCH_LEFT)); - } else if(m_digging_button == 1) { - m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::CAMERA_PUNCH_RIGHT)); - } + float m_digging_anim_was = m_digging_anim; + m_digging_anim += dtime; + const WieldAnimation &wield_anim = getCurrentWieldAnimation(); + if (m_digging_anim >= wield_anim.getDuration()) + { + m_digging_anim = 0; + m_digging_button = -1; + } + float lim = 0.05f; + if(m_digging_anim_was < lim && m_digging_anim >= lim) + { + if (m_digging_button == 0) { + m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::CAMERA_PUNCH_LEFT)); + } else if(m_digging_button == 1) { + m_client->getEventManager()->put(new SimpleTriggerEvent(MtEvent::CAMERA_PUNCH_RIGHT)); } } } @@ -559,7 +560,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r if (m_arm_inertia) addArmInertia(player->getYaw()); - const WieldAnimation &wield_anim = WieldAnimation::getNamed(m_wield_animation); + const WieldAnimation &wield_anim = getCurrentWieldAnimation(); // Position the wielded item //v3f wield_position = v3f(45, -35, 65); @@ -568,6 +569,7 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r v3f wield_rotation = v3f(-100, 120, -100); core::quaternion wield_rotation_q = core::quaternion(wield_rotation * core::DEGTORAD); wield_position.Y += fabs(m_wield_change_timer)*320 - 40; + #if 0 if(m_digging_anim < 0.05 || m_digging_anim > 0.5) { @@ -586,22 +588,22 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r //wield_rotation.Z += frac * 15.0 * pow(ratiothing2, 1.0f); } #endif - if (m_digging_button != -1) - { - f32 digfrac = m_digging_anim; - v3f anim_position = wield_anim.getTranslationAt(digfrac); - wield_position.X += anim_position.X; - wield_position.Y += anim_position.Y; - wield_position.Z += anim_position.Z; - - // Euler angles are PURE EVIL, so why not use quaternions? - core::quaternion quat_rot = wield_anim.getRotationAt(digfrac); - // apply rotation to starting rotation - wield_rotation_q *= quat_rot; - // convert back to euler angles - wield_rotation_q.toEuler(wield_rotation); - wield_rotation *= core::RADTODEG; - } else { + + f32 digfrac = m_digging_anim; + v3f anim_position = wield_anim.getTranslationAt(digfrac); + wield_position.X += anim_position.X; + wield_position.Y += anim_position.Y; + wield_position.Z += anim_position.Z; + + // Euler angles are PURE EVIL, so why not use quaternions? + core::quaternion quat_rot = wield_anim.getRotationAt(digfrac); + // apply rotation to starting rotation + wield_rotation_q *= quat_rot; + // convert back to euler angles + wield_rotation_q.toEuler(wield_rotation); + wield_rotation *= core::RADTODEG; + + if (m_digging_button == -1) { f32 bobfrac = my_modf(m_view_bobbing_anim); // std::cout << "Third block, frac = " << bobfrac << std::endl; wield_position.X -= sin(bobfrac*M_PI*2.0) * 3.0; @@ -783,3 +785,23 @@ void Camera::removeNametag(Nametag *nametag) m_nametags.remove(nametag); delete nametag; } + +const WieldAnimation &Camera::getCurrentWieldAnimation() +{ + std::string anim_name; + switch (m_digging_button) { + case -1: + anim_name = m_wield_animation_base; + break; + case 0: + anim_name = m_wield_animation_dig; + break; + case 1: + anim_name = m_wield_animation_place; + break; + case 2: + anim_name = m_wield_animation_activate; + break; + } + return WieldAnimation::getNamed(anim_name); +} diff --git a/src/client/camera.h b/src/client/camera.h index df156f06d..b5c4850ab 100644 --- a/src/client/camera.h +++ b/src/client/camera.h @@ -193,6 +193,8 @@ public: inline void addArmInertia(f32 player_yaw); + const WieldAnimation &getCurrentWieldAnimation(); + private: // Nodes scene::ISceneNode *m_playernode = nullptr; @@ -254,7 +256,10 @@ private: // If 0, left-click digging animation // If 1, right-click digging animation s32 m_digging_button = -1; - std::string m_wield_animation = ""; + std::string m_wield_animation_base = ""; + std::string m_wield_animation_dig = ""; + std::string m_wield_animation_place = ""; + std::string m_wield_animation_activate = ""; // Animation when changing wielded item f32 m_wield_change_timer = 0.125f; diff --git a/src/client/game.cpp b/src/client/game.cpp index 15fa2af23..acd0b959d 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -3106,6 +3106,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud, bool show_debug) client->getScript()->on_item_use(selected_item, pointed); } else if (wasKeyPressed(KeyType::PLACE)) { handlePointingAtNothing(selected_item); + camera->setDigging(2); } runData.pointed_old = pointed; |