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 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 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 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}