echo Message packets to other clients in the room
This commit is contained in:
		
							parent
							
								
									f149bb4dea
								
							
						
					
					
						commit
						11b51e97a2
					
				@ -1,6 +1,7 @@
 | 
			
		||||
 | 
			
		||||
use crate::common::serverstate::ClientId;
 | 
			
		||||
// TODO: room passwords?
 | 
			
		||||
// TODO: remove clients from areas (or upon insert, remove that id from anywhere else)
 | 
			
		||||
 | 
			
		||||
#[derive(Copy, Clone)]
 | 
			
		||||
pub struct ClientArea<const N: usize> {
 | 
			
		||||
@ -52,12 +53,12 @@ pub struct ClientLocation {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
enum JoinRoomError {
 | 
			
		||||
pub enum JoinRoomError {
 | 
			
		||||
    RoomDoesNotExist,
 | 
			
		||||
    RoomFull,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum JoinLobbyError {
 | 
			
		||||
pub enum JoinLobbyError {
 | 
			
		||||
    LobbyDoesNotExist,
 | 
			
		||||
    LobbyFull,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ use rand::Rng;
 | 
			
		||||
 | 
			
		||||
use libpso::packet::ship::*;
 | 
			
		||||
use libpso::packet::login::{Login, LoginResponse, AccountStatus, Session};
 | 
			
		||||
use libpso::packet::messages::*;
 | 
			
		||||
use libpso::{PacketParseError, PSOPacket};
 | 
			
		||||
use libpso::crypto::bb::PSOBBCipher;
 | 
			
		||||
use libpso::character::character;
 | 
			
		||||
@ -32,6 +33,7 @@ pub enum RecvShipPacket {
 | 
			
		||||
    Login(Login),
 | 
			
		||||
    MenuSelect(MenuSelect),
 | 
			
		||||
    CharData(CharData),
 | 
			
		||||
    Message(Message),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl RecvServerPacket for RecvShipPacket {
 | 
			
		||||
@ -40,6 +42,7 @@ impl RecvServerPacket for RecvShipPacket {
 | 
			
		||||
            0x93 => Ok(RecvShipPacket::Login(Login::from_bytes(data)?)),
 | 
			
		||||
            0x10 => Ok(RecvShipPacket::MenuSelect(MenuSelect::from_bytes(data)?)),
 | 
			
		||||
            0x61 => Ok(RecvShipPacket::CharData(CharData::from_bytes(data)?)),
 | 
			
		||||
            0x60 => Ok(RecvShipPacket::Message(Message::from_bytes(data)?)),
 | 
			
		||||
            _ => Err(PacketParseError::WrongPacketForServerType(u16::from_le_bytes([data[2], data[3]]), data.to_vec()))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -53,6 +56,7 @@ pub enum SendShipPacket {
 | 
			
		||||
    FullCharacter(FullCharacter),
 | 
			
		||||
    CharDataRequest(CharDataRequest),
 | 
			
		||||
    JoinLobby(JoinLobby),
 | 
			
		||||
    Message(Message),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl SendServerPacket for SendShipPacket {
 | 
			
		||||
@ -64,6 +68,7 @@ impl SendServerPacket for SendShipPacket {
 | 
			
		||||
            SendShipPacket::FullCharacter(pkt) => pkt.as_bytes(),
 | 
			
		||||
            SendShipPacket::CharDataRequest(pkt) => pkt.as_bytes(),
 | 
			
		||||
            SendShipPacket::JoinLobby(pkt) => pkt.as_bytes(),
 | 
			
		||||
            SendShipPacket::Message(pkt) => pkt.as_bytes(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -176,12 +181,19 @@ impl<EG: EntityGateway> ShipServerState<EG> {
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        self.client_location.add_to_lobby(id, 0);
 | 
			
		||||
 | 
			
		||||
        Ok(vec![
 | 
			
		||||
            SendShipPacket::JoinLobby(joinlobby)
 | 
			
		||||
        ])
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn message(&mut self, id: ClientId, msg: &Message) -> Box<dyn Iterator<Item = (ClientId, SendShipPacket)>> {
 | 
			
		||||
        let cmsg = msg.clone();
 | 
			
		||||
        Box::new(self.client_location.get_client_neighbors(id).into_iter().map(move |client| {
 | 
			
		||||
            (client, SendShipPacket::Message(cmsg.clone()))
 | 
			
		||||
        }))
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -218,6 +230,9 @@ impl<EG: EntityGateway> ServerState for ShipServerState<EG> {
 | 
			
		||||
            },
 | 
			
		||||
            RecvShipPacket::CharData(chardata) => {
 | 
			
		||||
                Box::new(self.send_player_to_lobby(id, chardata)?.into_iter().map(move |pkt| (id, pkt)))
 | 
			
		||||
            },
 | 
			
		||||
            RecvShipPacket::Message(msg) => {
 | 
			
		||||
                self.message(id, msg)
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user