veloren_common/states/
idle.rs

1use super::utils::*;
2use crate::{
3    comp::{
4        CharacterState, InventoryAction, StateUpdate, character_state::OutputEvents,
5        controller::InputKind, inventory::item::armor::Friction,
6    },
7    resources::Time,
8    states::behavior::{CharacterBehavior, JoinData},
9};
10use serde::{Deserialize, Serialize};
11
12#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Default)]
13pub struct Data {
14    pub is_sneaking: bool,
15    pub(crate) time_entered: Time,
16    // None means unknown
17    pub(crate) footwear: Option<Friction>,
18}
19
20impl CharacterBehavior for Data {
21    fn behavior(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate {
22        let mut update = StateUpdate::from(data);
23
24        const LEAVE_STANCE_DELAY: f64 = 30.0;
25        if (self.time_entered.0 + LEAVE_STANCE_DELAY) < data.time.0 {
26            leave_stance(data, output_events);
27        }
28
29        handle_skating(data, &mut update);
30        handle_orientation(data, &mut update, 1.0, None);
31        handle_move(data, &mut update, if self.is_sneaking { 0.4 } else { 1.0 });
32        handle_jump(data, output_events, &mut update, 1.0);
33        handle_wield(data, &mut update);
34        handle_climb(data, &mut update);
35        handle_wallrun(data, &mut update);
36        if input_is_pressed(data, InputKind::Roll) {
37            handle_input(data, output_events, &mut update, InputKind::Roll);
38        }
39
40        // Try to Fall/Stand up/Move
41        if self.is_sneaking
42            && (data.physics.on_ground.is_none() || data.physics.in_liquid().is_some())
43        {
44            update.character = CharacterState::Idle(Data {
45                is_sneaking: false,
46                time_entered: self.time_entered,
47                footwear: self.footwear,
48            });
49        }
50
51        update
52    }
53
54    fn swap_equipped_weapons(
55        &self,
56        data: &JoinData,
57        output_events: &mut OutputEvents,
58    ) -> StateUpdate {
59        let mut update = StateUpdate::from(data);
60        attempt_swap_equipped_weapons(data, &mut update, output_events);
61        update
62    }
63
64    fn manipulate_loadout(
65        &self,
66        data: &JoinData,
67        output_events: &mut OutputEvents,
68        inv_action: InventoryAction,
69    ) -> StateUpdate {
70        let mut update = StateUpdate::from(data);
71        handle_manipulate_loadout(data, output_events, &mut update, inv_action);
72        update
73    }
74
75    fn wield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
76        let mut update = StateUpdate::from(data);
77        attempt_wield(data, &mut update);
78        update
79    }
80
81    fn glide_wield(&self, data: &JoinData, output_events: &mut OutputEvents) -> StateUpdate {
82        let mut update = StateUpdate::from(data);
83        attempt_glide_wield(data, &mut update, output_events);
84        update
85    }
86
87    fn sit(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
88        let mut update = StateUpdate::from(data);
89        attempt_sit(data, &mut update);
90        update
91    }
92
93    fn crawl(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
94        let mut update = StateUpdate::from(data);
95        attempt_crawl(data, &mut update);
96        update
97    }
98
99    fn dance(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
100        let mut update = StateUpdate::from(data);
101        attempt_dance(data, &mut update);
102        update
103    }
104
105    fn sneak(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
106        let mut update = StateUpdate::from(data);
107        update.character = CharacterState::Idle(Data {
108            is_sneaking: true,
109            time_entered: self.time_entered,
110            footwear: self.footwear,
111        });
112        update
113    }
114
115    fn stand(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
116        let mut update = StateUpdate::from(data);
117        update.character = CharacterState::Idle(Data::default());
118        update
119    }
120
121    fn talk(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
122        let mut update = StateUpdate::from(data);
123        attempt_talk(data, &mut update);
124        update
125    }
126}