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