2023-05-19 11:22:32 +00:00
|
|
|
use glam::Mat4;
|
|
|
|
use shipyard::{Component, EntityId, Unique, AllStoragesView, UniqueView, NonSendSync, View, ViewMut, Get};
|
2023-02-12 00:32:59 +00:00
|
|
|
use hashbrown::HashMap;
|
2023-03-09 02:30:37 +00:00
|
|
|
use std::net::SocketAddr;
|
2023-05-19 11:22:32 +00:00
|
|
|
use kubi_shared::{
|
|
|
|
networking::{
|
|
|
|
client::{ClientIdMap, Client},
|
|
|
|
messages::{ClientToServerMessage, C_POSITION_CHANGED}
|
|
|
|
},
|
|
|
|
transform::Transform
|
|
|
|
};
|
|
|
|
use crate::{
|
|
|
|
server::{ServerEvents, UdpServer},
|
|
|
|
util::check_message_auth
|
2023-05-19 05:02:20 +00:00
|
|
|
};
|
2023-02-11 23:37:24 +00:00
|
|
|
|
2023-03-09 02:30:37 +00:00
|
|
|
#[derive(Component, Clone, Copy)]
|
|
|
|
pub struct ClientAddress(pub SocketAddr);
|
2023-02-12 00:32:59 +00:00
|
|
|
|
2023-03-09 02:30:37 +00:00
|
|
|
#[derive(Unique, Default)]
|
|
|
|
pub struct ClientAddressMap(pub HashMap<SocketAddr, EntityId>);
|
|
|
|
impl ClientAddressMap {
|
|
|
|
pub fn new() -> Self { Self::default() }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn init_client_maps(
|
|
|
|
storages: AllStoragesView
|
|
|
|
) {
|
|
|
|
storages.add_unique(ClientIdMap::new());
|
|
|
|
storages.add_unique(ClientAddressMap::new());
|
|
|
|
}
|
2023-05-19 05:02:20 +00:00
|
|
|
|
|
|
|
pub fn sync_client_positions(
|
|
|
|
server: NonSendSync<UniqueView<UdpServer>>,
|
|
|
|
events: UniqueView<ServerEvents>,
|
|
|
|
addr_map: UniqueView<ClientAddressMap>,
|
|
|
|
clients: View<Client>,
|
2023-05-19 11:22:32 +00:00
|
|
|
mut transforms: ViewMut<Transform>
|
2023-05-19 05:02:20 +00:00
|
|
|
) {
|
|
|
|
for event in &events.0 {
|
2023-05-19 11:22:32 +00:00
|
|
|
let Some(message) = check_message_auth::<C_POSITION_CHANGED>(&server, event, &clients, &addr_map) else {
|
|
|
|
continue;
|
2023-05-19 05:02:20 +00:00
|
|
|
};
|
2023-05-19 11:22:32 +00:00
|
|
|
let ClientToServerMessage::PositionChanged { position, velocity: _, direction } = message.message else {
|
2023-05-19 05:02:20 +00:00
|
|
|
unreachable!()
|
|
|
|
};
|
2023-05-19 11:22:32 +00:00
|
|
|
//Apply position to client
|
|
|
|
let mut trans = (&mut transforms).get(message.entity_id).unwrap();
|
|
|
|
trans.0 = Mat4::from_rotation_translation(direction, position);
|
2023-05-19 05:02:20 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|