Refactor
Updated handlers by spliting the TcpStream in half to allow reading and writing data at the same time. This fixes an issue where you are unable to get chat messages until the client sends a packet to the server Fixed client id's by adding the id manager Added shout chat handling
This commit is contained in:
@@ -17,7 +17,6 @@ fn distance(x1: f64, y1: f64, x2: f64, y2: f64) -> u16 {
|
||||
}
|
||||
|
||||
pub(crate) async fn handle_change_map_req(
|
||||
stream: Arc<Mutex<TcpStream>>,
|
||||
packet: Packet,
|
||||
character_client: Arc<Mutex<CharacterClient>>,
|
||||
connection_service: Arc<ConnectionService>,
|
||||
@@ -30,6 +29,7 @@ pub(crate) async fn handle_change_map_req(
|
||||
|
||||
let mut user_id = "".to_string();
|
||||
let mut char_id = 0;
|
||||
let mut client_id = 0;
|
||||
let mut character_id_list: Vec<u32> = Vec::new();
|
||||
let session_id;
|
||||
if let Some(mut state) = connection_service.get_connection(&connection_id) {
|
||||
@@ -37,6 +37,7 @@ pub(crate) async fn handle_change_map_req(
|
||||
session_id = state.session_id.expect("Missing session id in connection state");
|
||||
char_id = state.character_id.expect("Missing character id in connection state");
|
||||
character_id_list = state.character_list.clone().expect("Missing character id list");
|
||||
client_id = state.client_id;
|
||||
}
|
||||
|
||||
let mut character_client = character_client.lock().await;
|
||||
@@ -51,7 +52,7 @@ pub(crate) async fn handle_change_map_req(
|
||||
let time_as_u16 = (now.hour() * 100 + now.minute()) as u16;
|
||||
|
||||
let data = SrvChangeMapReply {
|
||||
object_index: character_id_list[char_id as usize] as u16,
|
||||
object_index: client_id,
|
||||
hp: stats.hp as u16,
|
||||
mp: stats.mp as u16,
|
||||
xp: stats.xp as u16,
|
||||
@@ -66,14 +67,16 @@ pub(crate) async fn handle_change_map_req(
|
||||
team_number: 10,
|
||||
};
|
||||
let response_packet = Packet::new(PacketType::PakwcChangeMapReply, &data)?;
|
||||
let mut locked_stream = stream.lock().await;
|
||||
send_packet(&mut locked_stream, &response_packet).await?;
|
||||
if let Some(mut state) = connection_service.get_connection_mut(&connection_id) {
|
||||
let writer_clone = state.writer.clone().unwrap();
|
||||
let mut locked_stream = writer_clone.lock().await;
|
||||
send_packet(&mut locked_stream, &response_packet).await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) async fn handle_mouse_cmd_req(
|
||||
stream: Arc<Mutex<TcpStream>>,
|
||||
packet: Packet,
|
||||
connection_service: Arc<ConnectionService>,
|
||||
connection_id: String,
|
||||
@@ -84,14 +87,16 @@ pub(crate) async fn handle_mouse_cmd_req(
|
||||
debug!("{:?}", request);
|
||||
|
||||
let mut char_id = 0;
|
||||
let mut client_id = 0;
|
||||
let mut character_id_list: Vec<u32> = Vec::new();
|
||||
if let Some(mut state) = connection_service.get_connection(&connection_id) {
|
||||
char_id = state.character_id.expect("Missing character id in connection state");
|
||||
character_id_list = state.character_list.clone().expect("Missing character id list");
|
||||
client_id = state.client_id;
|
||||
}
|
||||
|
||||
let data = SrvMouseCmd {
|
||||
id: character_id_list[char_id as usize] as u16,
|
||||
id: client_id,
|
||||
target_id: request.target_id,
|
||||
distance: distance(520000 as f64, 520000 as f64, request.x as f64, request.y as f64),
|
||||
x: request.x,
|
||||
@@ -99,7 +104,88 @@ pub(crate) async fn handle_mouse_cmd_req(
|
||||
z: request.z,
|
||||
};
|
||||
let response_packet = Packet::new(PacketType::PakwcMouseCmd, &data)?;
|
||||
let mut locked_stream = stream.lock().await;
|
||||
send_packet(&mut locked_stream, &response_packet).await?;
|
||||
if let Some(mut state) = connection_service.get_connection_mut(&connection_id) {
|
||||
let writer_clone = state.writer.clone().unwrap();
|
||||
let mut locked_stream = writer_clone.lock().await;
|
||||
send_packet(&mut locked_stream, &response_packet).await?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) async fn handle_togggle_move_req(
|
||||
packet: Packet,
|
||||
connection_service: Arc<ConnectionService>,
|
||||
connection_id: String,
|
||||
) -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||
use crate::packets::cli_toggle_move::*;
|
||||
use crate::packets::srv_toggle_move::*;
|
||||
let request = CliToggleMove::decode(packet.payload.as_slice())?;
|
||||
debug!("{:?}", request);
|
||||
|
||||
let mut client_id = 0;
|
||||
if let Some(mut state) = connection_service.get_connection(&connection_id) {
|
||||
client_id = state.client_id;
|
||||
}
|
||||
let mut toggle_type = 0;;
|
||||
{
|
||||
use crate::packets::cli_toggle_move::ToggleMove;
|
||||
match request.type_ {
|
||||
ToggleMove::Run => { toggle_type = 2; }
|
||||
ToggleMove::Sit => { toggle_type = 8; }
|
||||
ToggleMove::Drive => { toggle_type = 9; }
|
||||
}
|
||||
}
|
||||
|
||||
use crate::packets::srv_toggle_move::ToggleMove;
|
||||
let mut final_type = ToggleMove::Run;
|
||||
{
|
||||
match toggle_type {
|
||||
0 => { final_type = ToggleMove::Run; }
|
||||
1 => { final_type = ToggleMove::Sit; }
|
||||
2 => { final_type = ToggleMove::Drive; }
|
||||
_ => { final_type = ToggleMove::Run; }
|
||||
}
|
||||
}
|
||||
|
||||
let data = SrvToggleMove {
|
||||
object_id: client_id,
|
||||
type_: final_type,
|
||||
run_speed: 0,
|
||||
};
|
||||
let response_packet = Packet::new(PacketType::PakwcToggleMove, &data)?;
|
||||
if let Some(mut state) = connection_service.get_connection_mut(&connection_id) {
|
||||
let writer_clone = state.writer.clone().unwrap();
|
||||
let mut locked_stream = writer_clone.lock().await;
|
||||
send_packet(&mut locked_stream, &response_packet).await?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) async fn handle_set_animation_req(
|
||||
packet: Packet,
|
||||
connection_service: Arc<ConnectionService>,
|
||||
connection_id: String,
|
||||
) -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||
use crate::packets::cli_set_animation::*;
|
||||
use crate::packets::srv_set_animation::*;
|
||||
let request = CliSetAnimation::decode(packet.payload.as_slice())?;
|
||||
debug!("{:?}", request);
|
||||
|
||||
let mut client_id = 0;
|
||||
if let Some(mut state) = connection_service.get_connection(&connection_id) {
|
||||
client_id = state.client_id;
|
||||
}
|
||||
|
||||
let data = SrvSetAnimation {
|
||||
id: request.id,
|
||||
value: request.value,
|
||||
object_id: client_id,
|
||||
};
|
||||
let response_packet = Packet::new(PacketType::PacwcSetAnimation, &data)?;
|
||||
if let Some(mut state) = connection_service.get_connection_mut(&connection_id) {
|
||||
let writer_clone = state.writer.clone().unwrap();
|
||||
let mut locked_stream = writer_clone.lock().await;
|
||||
send_packet(&mut locked_stream, &response_packet).await?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user