veloren_common/states/
talk.rs1use super::utils::*;
2use crate::{
3 comp::{CharacterState, InventoryAction, StateUpdate, character_state::OutputEvents},
4 states::{
5 behavior::{CharacterBehavior, JoinData},
6 idle,
7 },
8};
9use serde::{Deserialize, Serialize};
10use std::time::Duration;
11
12const TURN_RATE: f32 = 40.0;
13const MIN_TALK_TIME: Duration = Duration::from_millis(500);
14
15#[derive(Copy, Clone, Default, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
16pub struct Data {
17 pub timer: Duration,
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 handle_wield(data, &mut update);
25 handle_orientation(data, &mut update, TURN_RATE, None);
26
27 update.character = if self.timer >= MIN_TALK_TIME {
28 CharacterState::Idle(idle::Data::default())
29 } else {
30 CharacterState::Talk(Self {
31 timer: self.timer + Duration::from_secs_f32(data.dt.0),
32 })
33 };
34
35 update
36 }
37
38 fn talk(&self, data: &JoinData, _output_events: &mut OutputEvents) -> StateUpdate {
39 let mut update = StateUpdate::from(data);
40
41 update.character = CharacterState::Talk(Self::default());
43
44 update
45 }
46
47 fn manipulate_loadout(
48 &self,
49 data: &JoinData,
50 output_events: &mut OutputEvents,
51 inv_action: InventoryAction,
52 ) -> StateUpdate {
53 let mut update = StateUpdate::from(data);
54 handle_manipulate_loadout(data, output_events, &mut update, inv_action);
55 update
56 }
57
58 fn wield(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
59 let mut update = StateUpdate::from(data);
60 attempt_wield(data, &mut update);
61 update
62 }
63
64 fn sit(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
65 let mut update = StateUpdate::from(data);
66 update.character = CharacterState::Idle(idle::Data::default());
67 attempt_sit(data, &mut update);
68 update
69 }
70
71 fn dance(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
72 let mut update = StateUpdate::from(data);
73 update.character = CharacterState::Idle(idle::Data::default());
74 attempt_dance(data, &mut update);
75 update
76 }
77
78 fn stand(&self, data: &JoinData, _: &mut OutputEvents) -> StateUpdate {
79 let mut update = StateUpdate::from(data);
80 update.character = CharacterState::Idle(idle::Data::default());
82 update
83 }
84}