ship select packet
This commit is contained in:
		
							parent
							
								
									d740b57dc7
								
							
						
					
					
						commit
						9bb2edf1eb
					
				@ -19,9 +19,11 @@ use crate::entity::character::Character;
 | 
			
		||||
use crate::login::login::get_login_status;
 | 
			
		||||
 | 
			
		||||
pub const CHARACTER_PORT: u16 = 12001;
 | 
			
		||||
const SHIP_MENU_ID: u32 = 1;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub enum CharacterError {
 | 
			
		||||
    InvalidMenuSelection(u32, u32),
 | 
			
		||||
    ClientNotFound(ClientId),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -36,7 +38,8 @@ pub enum RecvCharacterPacket {
 | 
			
		||||
    ParamDataRequest(ParamDataRequest),
 | 
			
		||||
    ParamDataChunkRequest(ParamDataChunkRequest),
 | 
			
		||||
    CharacterPreview(CharacterPreview),
 | 
			
		||||
    SetFlag(SetFlag)
 | 
			
		||||
    SetFlag(SetFlag),
 | 
			
		||||
    MenuSelect(MenuSelect),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl RecvServerPacket for RecvCharacterPacket {
 | 
			
		||||
@ -52,6 +55,7 @@ impl RecvServerPacket for RecvCharacterPacket {
 | 
			
		||||
            0x3EB => Ok(RecvCharacterPacket::ParamDataChunkRequest(ParamDataChunkRequest::from_bytes(data)?)),
 | 
			
		||||
            0xE5 => Ok(RecvCharacterPacket::CharacterPreview(CharacterPreview::from_bytes(data)?)),
 | 
			
		||||
            0xEC => Ok(RecvCharacterPacket::SetFlag(SetFlag::from_bytes(data)?)),
 | 
			
		||||
            0x10 => Ok(RecvCharacterPacket::MenuSelect(MenuSelect::from_bytes(data)?)),
 | 
			
		||||
            _ => Err(PacketParseError::WrongPacketForServerType)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -71,7 +75,8 @@ pub enum SendCharacterPacket {
 | 
			
		||||
    ParamDataHeader(ParamDataHeader),
 | 
			
		||||
    ParamDataChunk(ParamDataChunk),
 | 
			
		||||
    Timestamp(Timestamp),
 | 
			
		||||
    ShipList(ShipList)
 | 
			
		||||
    ShipList(ShipList),
 | 
			
		||||
    RedirectClient(RedirectClient),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl SendServerPacket for SendCharacterPacket {
 | 
			
		||||
@ -89,7 +94,7 @@ impl SendServerPacket for SendCharacterPacket {
 | 
			
		||||
            SendCharacterPacket::ParamDataChunk(pkt) => pkt.as_bytes(),
 | 
			
		||||
            SendCharacterPacket::Timestamp(pkt) => pkt.as_bytes(),
 | 
			
		||||
            SendCharacterPacket::ShipList(pkt) => pkt.as_bytes(),
 | 
			
		||||
            //SendLoginPacket::RedirectClient(pkt) => pkt.as_bytes(),
 | 
			
		||||
            SendCharacterPacket::RedirectClient(pkt) => pkt.as_bytes(),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -180,7 +185,6 @@ impl<EG: EntityGateway> CharacterServerState<EG> {
 | 
			
		||||
                         Ship::new("Thalarion", [127,0,0,1], 23425),
 | 
			
		||||
        ];
 | 
			
		||||
        CharacterServerState {
 | 
			
		||||
            //shared_state: shared_state,
 | 
			
		||||
            entity_gateway: entity_gateway,
 | 
			
		||||
            param_header: param_header,
 | 
			
		||||
            param_data: param_data,
 | 
			
		||||
@ -212,7 +216,7 @@ impl<EG: EntityGateway> CharacterServerState<EG> {
 | 
			
		||||
                 flag: 0,
 | 
			
		||||
                 ships: self.ships.iter().enumerate().map(|(i, s)| {
 | 
			
		||||
                     ShipListEntry {
 | 
			
		||||
                         menu: 0,
 | 
			
		||||
                         menu: SHIP_MENU_ID,
 | 
			
		||||
                         item: i as u32,
 | 
			
		||||
                         flags: 0,
 | 
			
		||||
                         name: utf8_to_utf16_array!(s.name, 0x11)
 | 
			
		||||
@ -313,6 +317,15 @@ impl<EG: EntityGateway> CharacterServerState<EG> {
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn select_ship(&mut self, menuselect: &MenuSelect) -> Result<Vec<SendCharacterPacket>, CharacterError> {
 | 
			
		||||
        if menuselect.menu != SHIP_MENU_ID {
 | 
			
		||||
           return Err(CharacterError::InvalidMenuSelection(menuselect.menu, menuselect.item));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let ship = self.ships.get(menuselect.item as usize)
 | 
			
		||||
                             .ok_or(CharacterError::InvalidMenuSelection(menuselect.menu, menuselect.item))?;
 | 
			
		||||
        Ok(vec![SendCharacterPacket::RedirectClient(RedirectClient::new(u32::from_le_bytes(ship.ip), ship.port))])
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<EG: EntityGateway> ServerState for CharacterServerState<EG> {
 | 
			
		||||
@ -424,6 +437,9 @@ impl<EG: EntityGateway> ServerState for CharacterServerState<EG> {
 | 
			
		||||
                                  code: 0
 | 
			
		||||
                              })
 | 
			
		||||
                ].into_iter().map(move |pkt| (id, pkt)))
 | 
			
		||||
            },
 | 
			
		||||
            RecvCharacterPacket::MenuSelect(menuselect) => {
 | 
			
		||||
                Box::new(self.select_ship(menuselect)?.into_iter().map(move |pkt| (id, pkt)))
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user