param pkt
This commit is contained in:
		
							parent
							
								
									dc35c5b82c
								
							
						
					
					
						commit
						e9a24e515d
					
				| @ -1,4 +1,6 @@ | ||||
| use std::net; | ||||
| use std::sync::Arc; | ||||
| use std::io::Read; | ||||
| 
 | ||||
| use rand::{Rng, RngCore}; | ||||
| use bcrypt::{DEFAULT_COST, hash, verify}; | ||||
| @ -16,6 +18,7 @@ use elseware::common::network::{PacketNetworkError}; | ||||
| use elseware::common::client::Client; | ||||
| use elseware::common::serverstate::{SendServerPacket, RecvServerPacket, ServerState, OnConnect, ClientId}; | ||||
| use elseware::common::util::array_to_utf8; | ||||
| use elseware::utf8_to_array; | ||||
| 
 | ||||
| use crate::dataaccess::DataAccess; | ||||
| use crate::login::{SharedLoginState, get_login_status}; | ||||
| @ -36,6 +39,8 @@ pub enum RecvCharacterPacket { | ||||
|     Checksum(Checksum), | ||||
|     GuildcardDataRequest(GuildcardDataRequest), | ||||
|     GuildcardDataChunkRequest(GuildcardDataChunkRequest), | ||||
|     ParamDataRequest(ParamDataRequest), | ||||
|     ParamDataChunkRequest(ParamDataChunkRequest), | ||||
| } | ||||
| 
 | ||||
| impl RecvServerPacket for RecvCharacterPacket { | ||||
| @ -47,6 +52,8 @@ impl RecvServerPacket for RecvCharacterPacket { | ||||
|             0x1E8 => Ok(RecvCharacterPacket::Checksum(Checksum::from_bytes(data)?)), | ||||
|             0x3E8 => Ok(RecvCharacterPacket::GuildcardDataRequest(GuildcardDataRequest::from_bytes(data)?)), | ||||
|             0x3DC => Ok(RecvCharacterPacket::GuildcardDataChunkRequest(GuildcardDataChunkRequest::from_bytes(data)?)), | ||||
|             0x4EB => Ok(RecvCharacterPacket::ParamDataRequest(ParamDataRequest::from_bytes(data)?)), | ||||
|             0x3EB => Ok(RecvCharacterPacket::ParamDataChunkRequest(ParamDataChunkRequest::from_bytes(data)?)), | ||||
|             _ => Err(PacketParseError::WrongPacketForServerType) | ||||
|         } | ||||
|     } | ||||
| @ -62,7 +69,9 @@ pub enum SendCharacterPacket { | ||||
|     ChecksumAck(ChecksumAck), | ||||
|     CharacterPreview(CharacterPreview), | ||||
|     GuildcardDataHeader(GuildcardDataHeader), | ||||
|     GuildcardDataChunk(GuildcardDataChunk) | ||||
|     GuildcardDataChunk(GuildcardDataChunk), | ||||
|     ParamDataHeader(ParamDataHeader), | ||||
|     ParamDataChunk(ParamDataChunk), | ||||
| } | ||||
| 
 | ||||
| impl SendServerPacket for SendCharacterPacket { | ||||
| @ -76,14 +85,52 @@ impl SendServerPacket for SendCharacterPacket { | ||||
|             SendCharacterPacket::CharacterPreview(pkt) => pkt.as_bytes(), | ||||
|             SendCharacterPacket::GuildcardDataHeader(pkt) => pkt.as_bytes(), | ||||
|             SendCharacterPacket::GuildcardDataChunk(pkt) => pkt.as_bytes(), | ||||
|             SendCharacterPacket::ParamDataHeader(pkt) => pkt.as_bytes(), | ||||
|             SendCharacterPacket::ParamDataChunk(pkt) => pkt.as_bytes(), | ||||
|             //SendLoginPacket::RedirectClient(pkt) => pkt.as_bytes(),
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| fn generate_param_data(path: &str) -> (ParamDataHeader, Vec<u8>) { | ||||
|     let paths = std::fs::read_dir(path).expect("could not find param/ directory"); | ||||
| 
 | ||||
|     let mut files = Vec::new(); | ||||
|     let mut buffer = Vec::new(); | ||||
|     for p in paths { | ||||
|         let param = p.unwrap().path(); | ||||
|         let mut file = std::fs::File::open(¶m).unwrap(); | ||||
| 
 | ||||
|         let mut filebuf = Vec::new(); | ||||
|         let len = file.read_to_end(&mut filebuf).unwrap(); | ||||
| 
 | ||||
|         let mut crc = crc32::Digest::new(crc32::IEEE); | ||||
|         crc.write(&filebuf[..]); | ||||
| 
 | ||||
|         files.push(ParamFile { | ||||
|             size: len as u32, | ||||
|             checksum: crc.sum32(), | ||||
|             offset: buffer.len() as u32, | ||||
|             filename: utf8_to_array!(param.file_name().unwrap().to_str().unwrap(), 0x40), | ||||
|         }); | ||||
| 
 | ||||
|         buffer.append(&mut filebuf); | ||||
|     } | ||||
| 
 | ||||
|     (ParamDataHeader { | ||||
|         files: files | ||||
|     }, buffer) | ||||
| } | ||||
| 
 | ||||
| // TODO: rip these client-specific vars into a HashMap<ClientId, ClientState>
 | ||||
| pub struct CharacterServerState<DA: DataAccess> { | ||||
|     //shared_state: SharedLoginState<DA>,
 | ||||
|     data_access: DA, | ||||
|     param_header: ParamDataHeader, | ||||
| 
 | ||||
|     param_index: usize, | ||||
|     param_data: Arc<Vec<u8>>, | ||||
|     user: Option<UserAccount>, | ||||
|     characters: Option<[Option<Character>; 4]>, | ||||
|     guildcard_data_buffer: Option<Vec<u8>>, | ||||
| @ -92,9 +139,15 @@ pub struct CharacterServerState<DA: DataAccess> { | ||||
| 
 | ||||
| impl<DA: DataAccess> CharacterServerState<DA> { | ||||
|     pub fn new(data_access: DA) -> CharacterServerState<DA> { | ||||
|         let (param_header, param_data) = generate_param_data("param/"); | ||||
| 
 | ||||
|         CharacterServerState { | ||||
|             //shared_state: shared_state,
 | ||||
|             data_access: data_access, | ||||
|             param_header: param_header, | ||||
| 
 | ||||
|             param_index: 0, | ||||
|             param_data: Arc::new(param_data), | ||||
|             user: None, | ||||
|             characters: None, | ||||
|             guildcard_data_buffer: None, | ||||
| @ -226,6 +279,27 @@ impl<DA: DataAccess> ServerState for CharacterServerState<DA> { | ||||
|             }, | ||||
|             RecvCharacterPacket::GuildcardDataChunkRequest(request) => { | ||||
|                 Box::new(self.guildcard_data_chunk(request.chunk, request.again).into_iter().map(move |pkt| (id, pkt))) | ||||
|             }, | ||||
|             RecvCharacterPacket::ParamDataRequest(_request) => { | ||||
|                 Box::new(vec![SendCharacterPacket::ParamDataHeader(self.param_header.clone())].into_iter().map(move |pkt| (id, pkt))) | ||||
|             }, | ||||
|             RecvCharacterPacket::ParamDataChunkRequest(_request) => { | ||||
|                 let chunk = self.param_index; | ||||
|                 self.param_index += 1; | ||||
| 
 | ||||
|                 let start = chunk * 0x6800; | ||||
|                 let end = std::cmp::min((chunk+1)*0x6800, self.param_data.len()); | ||||
| 
 | ||||
|                 let mut data = [0u8; 0x6800]; | ||||
|                 data[..end-start].copy_from_slice(&self.param_data[start..end]); | ||||
| 
 | ||||
|                 Box::new(vec![SendCharacterPacket::ParamDataChunk( | ||||
|                     ParamDataChunk { | ||||
|                         flag: 0, | ||||
|                         chunk: chunk as u32, | ||||
|                         data: data, | ||||
|                     } | ||||
|                 )].into_iter().map(move |pkt| (id, pkt))) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user