#![allow(dead_code)] use elseware::common::serverstate::{ClientId, ServerState}; use elseware::entity::gateway::EntityGateway; use elseware::entity::account::{UserAccountEntity, NewUserAccountEntity, NewUserSettingsEntity}; use elseware::entity::character::{CharacterEntity, NewCharacterEntity}; use elseware::entity::item::{Meseta, BankName, BankIdentifier}; use elseware::ship::ship::{ShipServerState, RecvShipPacket}; use elseware::ship::room::Difficulty; use elseware::entity::item; use libpso::packet::ship::*; use libpso::packet::login::{Login, Session}; use libpso::{utf8_to_array, utf8_to_utf16_array}; //TODO: remove kb_conf_preset pub async fn new_user_character(entity_gateway: &mut EG, username: &str, password: &str, kb_conf_preset: usize) -> (UserAccountEntity, CharacterEntity) { let new_user = NewUserAccountEntity { email: format!("{}@pso.com", username), username: username.into(), password: bcrypt::hash(password, 5).unwrap(), guildcard: 1, activated: true, ..NewUserAccountEntity::default() }; let user = entity_gateway.create_user(new_user).await.unwrap(); let new_settings = NewUserSettingsEntity::new(user.id); let _settings = entity_gateway.create_user_settings(new_settings).await.unwrap(); let new_character = NewCharacterEntity::new(user.id); let character = entity_gateway.create_character(new_character).await.unwrap(); entity_gateway.set_character_meseta(&character.id, Meseta(0)).await.unwrap(); entity_gateway.set_bank_meseta(&character.id, &BankIdentifier::Character, Meseta(0)).await.unwrap(); (user, character) } pub async fn log_in_char(ship: &mut ShipServerState, id: ClientId, username: &str, password: &str) { let username = username.to_string(); let password = password.to_string(); ship.handle(id, RecvShipPacket::Login(Login { tag: 0, guildcard: 0, version: 0, unknown1: [0; 6], team: 0, username: utf8_to_array!(username, 16), unknown2: [0; 32], password: utf8_to_array!(password, 16), unknown3: [0; 40], hwinfo: [0; 8], session: Session::new(), })).await.unwrap(); } pub async fn join_lobby(ship: &mut ShipServerState, id: ClientId) { ship.handle(id, RecvShipPacket::CharData(CharData { _unknown: [0; 0x828] })).await.unwrap(); } pub async fn create_room(ship: &mut ShipServerState, id: ClientId, name: &str, password: &str) { create_room_with_difficulty(ship, id, name, password, Difficulty::Normal).await; } pub async fn leave_room(ship: &mut ShipServerState, id: ClientId) { ship.handle(id, RecvShipPacket::LobbySelect(LobbySelect { menu: 3, lobby: 0, })).await.unwrap(); } pub async fn create_room_with_difficulty(ship: &mut ShipServerState, id: ClientId, name: &str, password: &str, difficulty: Difficulty) { ship.handle(id, RecvShipPacket::CreateRoom(CreateRoom { unknown: [0; 2], name: utf8_to_utf16_array!(name, 16), password: utf8_to_utf16_array!(password, 16), difficulty: difficulty.into(), battle: 0, challenge: 0, episode: 1, single_player: 0, padding: [0; 3], })).await.unwrap(); ship.handle(id, RecvShipPacket::DoneBursting(DoneBursting {})).await.unwrap(); } pub async fn join_room(ship: &mut ShipServerState, id: ClientId, room_id: u32) { ship.handle(id, RecvShipPacket::MenuSelect(MenuSelect { menu: ROOM_MENU_ID, item: room_id, })).await.unwrap(); ship.handle(id, RecvShipPacket::DoneBursting(DoneBursting {})).await.unwrap(); } pub struct WeaponBuilder { weapon: item::weapon::WeaponType, grind: u8, } impl WeaponBuilder { pub fn grind(self, grind: u8) -> WeaponBuilder { WeaponBuilder { grind, ..self } } pub fn as_new(self) -> item::NewItemEntity { item::NewItemEntity { item: item::ItemDetail::Weapon( item::weapon::Weapon { weapon: self.weapon, grind: self.grind, special: None, attrs: [None, None, None], tekked: true, } ) } } } pub struct ItemBuilder; impl ItemBuilder { pub fn weapon(weapon: item::weapon::WeaponType) -> WeaponBuilder { WeaponBuilder { weapon, grind: 0, } } }