aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/pads_player.rs116
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