1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
use crate::data::Gamedata;
use glam::{IVec2, Vec2};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct PlayerID(pub i64);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct ItemIndex(pub usize);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct TileIndex(pub usize);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct RecipeIndex(pub usize);
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[serde(transparent)]
pub struct DemandIndex(pub usize);
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum PacketS {
Join {
name: String,
character: i32,
},
Leave,
Position {
pos: Vec2,
rot: f32,
},
Interact {
pos: IVec2,
edge: bool,
},
Collide {
player: PlayerID,
force: Vec2,
},
Communicate {
message: Option<Message>,
},
#[serde(skip)]
ReplaceHand {
item: Option<ItemIndex>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Message {
Text(String),
Item(ItemIndex),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum PacketC {
Init {
data: Gamedata,
id: PlayerID,
},
AddPlayer {
id: PlayerID,
position: Vec2,
character: i32,
name: String,
},
RemovePlayer {
id: PlayerID,
},
Position {
player: PlayerID,
pos: Vec2,
rot: f32,
},
TakeItem {
tile: IVec2,
player: PlayerID,
},
PutItem {
player: PlayerID,
tile: IVec2,
},
SetTileItem {
tile: IVec2,
item: Option<ItemIndex>,
},
SetPlayerItem {
player: PlayerID,
item: Option<ItemIndex>,
},
SetActive {
tile: IVec2,
progress: Option<f32>,
warn: bool,
},
UpdateMap {
pos: IVec2,
tile: TileIndex,
neighbors: [Option<TileIndex>; 4],
},
Collide {
player: PlayerID,
force: Vec2,
},
Communicate {
player: PlayerID,
message: Option<Message>,
},
Error {
message: String,
},
}
|