@@ 8,4 8,4 @@ bevy = { version = "0.12", default-features = false }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
bevy_twite = { git = "https://gitlab.com/ghostlyzsh/twite.git" }
-tracing-subscriber = "0.3">
\ No newline at end of file
+tracing-subscriber = "0.3"
@@ 0,0 1,18 @@
+#[macro_export]
+macro_rules! err_or_cont {
+ ($expr:expr) => {
+ match $expr {
+ Ok(n) => n,
+ Err(_) => continue
+ }
+ };
+}
+#[macro_export]
+macro_rules! some_or_cont {
+ ($expr:expr) => {
+ match $expr {
+ Some(n) => n,
+ None => continue
+ }
+ };
+}
@@ 6,6 6,7 @@ use packet::*;
pub mod component;
pub mod packet;
+pub mod macros;
fn main() {
let subscriber = tracing_subscriber::FmtSubscriber::new();
@@ 20,7 21,8 @@ fn main() {
.add_plugins(MinimalPlugins)
.add_plugins(TwiteServerPlugin)
.add_systems(Startup, spawn_planets)
- .add_systems(Update, on_connection)
+ //.add_systems(Update, on_connection)
+ .add_systems(Update, on_message)
.add_systems(FixedUpdate, on_position_change)
.run();
@@ 36,7 38,7 @@ fn spawn_planets(mut commands: Commands) {
});
}
-fn on_connection(
+/*fn on_connection(
mut commands: Commands,
planet_query: Query<(Entity, &PlanetType, &Transform)>,
mut reader: Local<ManualEventReader<ServerEvent>>,
@@ 68,13 70,70 @@ fn on_connection(
let packet = Packet::PlanetPositions { planets };
let buf = serde_json::to_vec(&packet).unwrap();
-
packets.push(ServerEvent::Send(*addr, MessageType::Text, buf));
}
}
for packet in packets {
events.send(packet);
}
+}*/
+
+fn on_message(
+ mut commands: Commands,
+ planet_query: Query<(Entity, &PlanetType, &Transform)>,
+ mut packet_recv: Local<ManualEventReader<ServerEvent>>,
+ mut packet_send: ResMut<Events<ServerEvent>>,
+) {
+ let mut packets = Vec::new();
+ for ev in packet_recv.read(&packet_send) {
+ if let ServerEvent::Recv(addr, MessageType::Text, data) = ev {
+ let data = String::from_utf8_lossy(&data);
+ let json: serde_json::Value = err_or_cont!(serde_json::from_str(&data));
+ let packet_type = json["t"].clone();
+ let data = json["c"].clone();
+ let packet_type = some_or_cont!(packet_type.as_str());
+ match packet_type {
+ "ClientLogin" => {
+ // spawn player
+ let transform = Transform::from_xyz(0.0, 0.0, 0.0);
+ let id = commands
+ .spawn(PlayerBundle {
+ part: PartBundle {
+ part_type: PartType::Hearty,
+ transform: TransformBundle::from(transform),
+ },
+ addr: Player(*addr),
+ }).id().index();
+ // tell other clients that a player has spawned
+ let username = data["username"].clone();
+ let username = some_or_cont!(username.as_str());
+ let packet = Packet::SpawnPlayer {
+ id,
+ username: username.to_string(),
+ position: proto_transform!(transform),
+ };
+ let buf = serde_json::to_vec(&packet).unwrap();
+ packets.push(ServerEvent::Broadcast(MessageType::Text, buf));
+
+ // tell this player the planets
+ let mut planets = Vec::new();
+ for (entity, planet_type, transform) in planet_query.iter() {
+ planets.push((entity.index(), Planet {
+ planet_type: *planet_type,
+ transform: proto_transform!(transform)
+ }));
+ }
+ let packet = Packet::PlanetPositions { planets };
+ let buf = serde_json::to_vec(&packet).unwrap();
+ packets.push(ServerEvent::Send(*addr, MessageType::Text, buf));
+ }
+ _ => continue
+ };
+ }
+ }
+ for packet in packets {
+ packet_send.send(packet);
+ }
}
fn on_position_change(