diff options
Diffstat (limited to 'core/src/pads_player.rs')
| -rw-r--r-- | core/src/pads_player.rs | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/core/src/pads_player.rs b/core/src/pads_player.rs new file mode 100644 index 0000000..d23ef39 --- /dev/null +++ b/core/src/pads_player.rs @@ -0,0 +1,116 @@ +use std::net::SocketAddr; +use hex::encode; +use serde::{Deserialize, Serialize}; +use sha1::{Digest, Sha1}; +use crate::constants::SALT; +use crate::pads_server::ServerMessage; + +/// 玩家客户端 +pub struct PadClient { + player_info: PlayerInfo, + remote_addr: SocketAddr, + receive_skin_package : bool +} + +impl Default for PadClient { + + fn default() -> Self { + PadClient { + player_info: PlayerInfo::default(), + remote_addr: SocketAddr::from(([127, 0, 0, 1], 8916)), + receive_skin_package: true + } + } +} + +/// 玩家客户端事件 +pub trait PadClientEvent { + + /// 加入游戏 + fn joined_game(); + + /// 加入游戏失败 + fn joined_game_failed(); + + /// 退出游戏 + fn left_game(); + + /// 被踢出游戏 + fn kicked(); + + /// 被该游戏封禁(若游戏未保存名单,则游戏重启前无法进入) + fn banned(); + + /// 掉线 + fn disconnected(); + + /// 接收到消息 + fn msg_received(msg: ServerMessage); +} + +/// 玩家信息 +pub struct PlayerInfo { + display_name: String, + name_hash: String, + + // 颜色 HSV + color_hue: i32, // 0 - 360 + color_saturation: f64, // 0 - 1 + color_value: f64 // 0 - 1 +} + +impl Default for PlayerInfo { + + fn default() -> Self { + PlayerInfo { + display_name: String::from("Player"), + name_hash: String::new(), + color_hue: 86, + color_saturation: 1.0, + color_value: 1.0, + } + } +} + +/// 玩家消息 +#[derive(Serialize, Deserialize, PartialEq)] +pub enum PlayerMessage { + Message(String), + Command(String), + ButtonPressed(u8), + ButtonReleased(u8), + Axis(u8, (f64, f64)) +} + +impl PlayerInfo { + + /// # 配置玩家 ID 和 名称 + /// self : 自身 + /// display_name : 玩家显示名称 + /// id : 玩家 ID + /// return -> 自身 + pub fn name(&mut self, display_name: String, id: &String) -> &mut Self { + self.display_name = display_name; + + let combined = format!("{}{}{}", &self.display_name, id, SALT); + let mut hasher = Sha1::new(); + hasher.update(combined); + let result = hasher.finalize(); + + self.name_hash = encode(&result[..]); + self + } + + /// # 配置玩家颜色 + /// self : 自身 + /// hue : 色调 0 -> RED; 120 -> GREEN; 240 -> BLUE + /// saturation : 饱和度 + /// value : 明度 + /// return -> 自身 + pub fn color_hsv(&mut self, hue: i32, saturation: f64, value: f64) -> &mut Self { + self.color_hue = hue.clamp(0, 360); + self.color_saturation = saturation.clamp(0.0, 1.0); + self.color_value = value.clamp(0.0, 1.0); + self + } +}
\ No newline at end of file |
