veloren_common/states/
idle.rs1use 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 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 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}