andy what were you doing
make guild card sending much more sane
This commit is contained in:
		
							parent
							
								
									bf595f9693
								
							
						
					
					
						commit
						de8f44f269
					
				@ -32,10 +32,3 @@ pub struct GuildCardData {
 | 
				
			|||||||
    pub user_id: u32,
 | 
					    pub user_id: u32,
 | 
				
			||||||
    pub guildcard: guildcard::GuildCardData,
 | 
					    pub guildcard: guildcard::GuildCardData,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(Clone, Default)]
 | 
					 | 
				
			||||||
pub struct GuildCard {
 | 
					 | 
				
			||||||
    pub id: u32,
 | 
					 | 
				
			||||||
    pub character_id: u32,
 | 
					 | 
				
			||||||
    pub guildcard: guildcard::GuildCard,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,7 +1,6 @@
 | 
				
			|||||||
use std::convert::{From, Into, TryFrom, TryInto};
 | 
					use std::convert::{From, Into, TryFrom, TryInto};
 | 
				
			||||||
use std::collections::HashMap;
 | 
					use std::collections::HashMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use libpso::character::character;
 | 
					 | 
				
			||||||
use libpso::packet::ship::{UpdateConfig, WriteInfoboard};
 | 
					use libpso::packet::ship::{UpdateConfig, WriteInfoboard};
 | 
				
			||||||
use crate::entity::item::tech::Technique;
 | 
					use crate::entity::item::tech::Technique;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -223,6 +222,10 @@ impl CharacterInfoboard {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Clone, Default)]
 | 
				
			||||||
 | 
					pub struct CharacterGuildCard {
 | 
				
			||||||
 | 
					    pub description: String,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Clone)]
 | 
					#[derive(Clone)]
 | 
				
			||||||
pub struct CharacterEntity {
 | 
					pub struct CharacterEntity {
 | 
				
			||||||
@ -240,6 +243,7 @@ pub struct CharacterEntity {
 | 
				
			|||||||
    pub techs: CharacterTechniques,
 | 
					    pub techs: CharacterTechniques,
 | 
				
			||||||
    pub config: CharacterConfig,
 | 
					    pub config: CharacterConfig,
 | 
				
			||||||
    pub info_board: CharacterInfoboard,
 | 
					    pub info_board: CharacterInfoboard,
 | 
				
			||||||
 | 
					    pub guildcard: CharacterGuildCard,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl std::default::Default for CharacterEntity {
 | 
					impl std::default::Default for CharacterEntity {
 | 
				
			||||||
@ -256,6 +260,7 @@ impl std::default::Default for CharacterEntity {
 | 
				
			|||||||
            techs: CharacterTechniques::new(),
 | 
					            techs: CharacterTechniques::new(),
 | 
				
			||||||
            config: CharacterConfig::new(),
 | 
					            config: CharacterConfig::new(),
 | 
				
			||||||
            info_board: CharacterInfoboard::new(),
 | 
					            info_board: CharacterInfoboard::new(),
 | 
				
			||||||
 | 
					            guildcard: CharacterGuildCard::default(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -52,12 +52,4 @@ pub trait EntityGateway {
 | 
				
			|||||||
    fn get_items_by_character(&self, _char: &CharacterEntity) -> Vec<Item> {
 | 
					    fn get_items_by_character(&self, _char: &CharacterEntity) -> Vec<Item> {
 | 
				
			||||||
        unimplemented!();
 | 
					        unimplemented!();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn create_guild_card_by_character(&self, _character: &CharacterEntity) -> GuildCard {
 | 
					 | 
				
			||||||
        unimplemented!();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn get_guild_card_by_character(&self, _character: &CharacterEntity) -> Option<GuildCard> {
 | 
					 | 
				
			||||||
        unimplemented!();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,6 @@ use std::sync::{Arc, Mutex};
 | 
				
			|||||||
pub struct InMemoryGateway {
 | 
					pub struct InMemoryGateway {
 | 
				
			||||||
    users: Arc<Mutex<HashMap<u32, UserAccount>>>,
 | 
					    users: Arc<Mutex<HashMap<u32, UserAccount>>>,
 | 
				
			||||||
    user_settings: Arc<Mutex<HashMap<u32, UserSettings>>>,
 | 
					    user_settings: Arc<Mutex<HashMap<u32, UserSettings>>>,
 | 
				
			||||||
    guildcards: Arc<Mutex<HashMap<u32, GuildCard>>>,
 | 
					 | 
				
			||||||
    characters: Arc<Mutex<HashMap<u32, CharacterEntity>>>,
 | 
					    characters: Arc<Mutex<HashMap<u32, CharacterEntity>>>,
 | 
				
			||||||
    items: Arc<Mutex<HashMap<ItemEntityId, Item>>>,
 | 
					    items: Arc<Mutex<HashMap<ItemEntityId, Item>>>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -25,7 +24,6 @@ impl InMemoryGateway {
 | 
				
			|||||||
        InMemoryGateway {
 | 
					        InMemoryGateway {
 | 
				
			||||||
            users: Arc::new(Mutex::new(HashMap::new())),
 | 
					            users: Arc::new(Mutex::new(HashMap::new())),
 | 
				
			||||||
            user_settings: Arc::new(Mutex::new(HashMap::new())),
 | 
					            user_settings: Arc::new(Mutex::new(HashMap::new())),
 | 
				
			||||||
            guildcards: Arc::new(Mutex::new(HashMap::new())),
 | 
					 | 
				
			||||||
            characters: Arc::new(Mutex::new(HashMap::new())),
 | 
					            characters: Arc::new(Mutex::new(HashMap::new())),
 | 
				
			||||||
            items: Arc::new(Mutex::new(HashMap::new())),
 | 
					            items: Arc::new(Mutex::new(HashMap::new())),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -143,40 +141,4 @@ impl EntityGateway for InMemoryGateway {
 | 
				
			|||||||
            })
 | 
					            })
 | 
				
			||||||
            .collect()
 | 
					            .collect()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn create_guild_card_by_character(&self, character: &CharacterEntity) -> GuildCard {
 | 
					 | 
				
			||||||
        let mut guildcards = self.guildcards.lock().unwrap();
 | 
					 | 
				
			||||||
        let user = self.get_user_by_id(character.user_id).unwrap();
 | 
					 | 
				
			||||||
        let settings = self.get_user_settings_by_user(&user).unwrap();
 | 
					 | 
				
			||||||
        let id = guildcards
 | 
					 | 
				
			||||||
            .iter()
 | 
					 | 
				
			||||||
            .fold(0, |sum, (i, _)| std::cmp::max(sum, *i))
 | 
					 | 
				
			||||||
            + 1;
 | 
					 | 
				
			||||||
        let new_guildcard = GuildCard {
 | 
					 | 
				
			||||||
            id: id,
 | 
					 | 
				
			||||||
            character_id: character.id,
 | 
					 | 
				
			||||||
            guildcard: libpso::character::guildcard::GuildCard {
 | 
					 | 
				
			||||||
                guildcard: user.guildcard,
 | 
					 | 
				
			||||||
                name: libpso::utf8_to_utf16_array!(character.name, 24),
 | 
					 | 
				
			||||||
                team: settings.settings.team_name,
 | 
					 | 
				
			||||||
                desc: [0; 88], // TODO?
 | 
					 | 
				
			||||||
                reserved1: 1,
 | 
					 | 
				
			||||||
                language: 0,
 | 
					 | 
				
			||||||
                section_id: character.section_id.into(),
 | 
					 | 
				
			||||||
                class: character.char_class.into(),
 | 
					 | 
				
			||||||
                padding: 0,
 | 
					 | 
				
			||||||
                comment: [0; 88], // TODO?
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        guildcards.insert(id, new_guildcard.clone());
 | 
					 | 
				
			||||||
        new_guildcard
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    fn get_guild_card_by_character(&self, character: &CharacterEntity) -> Option<GuildCard> {
 | 
					 | 
				
			||||||
        let guildcards = self.guildcards.lock().unwrap();
 | 
					 | 
				
			||||||
        guildcards
 | 
					 | 
				
			||||||
            .iter()
 | 
					 | 
				
			||||||
            .find(|(_, k)| k.character_id == character.id)
 | 
					 | 
				
			||||||
            .map(|(_, k)| k.clone())
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -73,13 +73,11 @@ fn main() {
 | 
				
			|||||||
    entity_gateway.create_user_settings_by_user(&fake_user);
 | 
					    entity_gateway.create_user_settings_by_user(&fake_user);
 | 
				
			||||||
    let mut character = entity_gateway.new_character_by_user(&fake_user);
 | 
					    let mut character = entity_gateway.new_character_by_user(&fake_user);
 | 
				
			||||||
    character.name = "Test Char 1".into();
 | 
					    character.name = "Test Char 1".into();
 | 
				
			||||||
    entity_gateway.create_guild_card_by_character(&character);
 | 
					 | 
				
			||||||
    entity_gateway.set_character(&character);
 | 
					    entity_gateway.set_character(&character);
 | 
				
			||||||
    let mut character = entity_gateway.new_character_by_user(&fake_user);
 | 
					    let mut character = entity_gateway.new_character_by_user(&fake_user);
 | 
				
			||||||
    character.slot = 2;
 | 
					    character.slot = 2;
 | 
				
			||||||
    character.name = "\tE12345678".into();
 | 
					    character.name = "\tE12345678".into();
 | 
				
			||||||
    character.exp = 80000000;
 | 
					    character.exp = 80000000;
 | 
				
			||||||
    entity_gateway.create_guild_card_by_character(&character);
 | 
					 | 
				
			||||||
    entity_gateway.set_character(&character);
 | 
					    entity_gateway.set_character(&character);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    entity_gateway.new_item(
 | 
					    entity_gateway.new_item(
 | 
				
			||||||
@ -115,12 +113,10 @@ fn main() {
 | 
				
			|||||||
    entity_gateway.create_user_settings_by_user(&fake_user2);
 | 
					    entity_gateway.create_user_settings_by_user(&fake_user2);
 | 
				
			||||||
    let mut character = entity_gateway.new_character_by_user(&fake_user2);
 | 
					    let mut character = entity_gateway.new_character_by_user(&fake_user2);
 | 
				
			||||||
    character.name = "Test Char 3".into();
 | 
					    character.name = "Test Char 3".into();
 | 
				
			||||||
    entity_gateway.create_guild_card_by_character(&character);
 | 
					 | 
				
			||||||
    entity_gateway.set_character(&character);
 | 
					    entity_gateway.set_character(&character);
 | 
				
			||||||
    let mut character = entity_gateway.new_character_by_user(&fake_user2);
 | 
					    let mut character = entity_gateway.new_character_by_user(&fake_user2);
 | 
				
			||||||
    character.slot = 2;
 | 
					    character.slot = 2;
 | 
				
			||||||
    character.name = "Test Char 4".into();
 | 
					    character.name = "Test Char 4".into();
 | 
				
			||||||
    entity_gateway.create_guild_card_by_character(&character);
 | 
					 | 
				
			||||||
    entity_gateway.set_character(&character);
 | 
					    entity_gateway.set_character(&character);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let fake_user3 = UserAccount {
 | 
					    let fake_user3 = UserAccount {
 | 
				
			||||||
@ -138,12 +134,10 @@ fn main() {
 | 
				
			|||||||
    entity_gateway.create_user_settings_by_user(&fake_user3);
 | 
					    entity_gateway.create_user_settings_by_user(&fake_user3);
 | 
				
			||||||
    let mut character = entity_gateway.new_character_by_user(&fake_user3);
 | 
					    let mut character = entity_gateway.new_character_by_user(&fake_user3);
 | 
				
			||||||
    character.name = "Test Char 5".into();
 | 
					    character.name = "Test Char 5".into();
 | 
				
			||||||
    entity_gateway.create_guild_card_by_character(&character);
 | 
					 | 
				
			||||||
    entity_gateway.set_character(&character);
 | 
					    entity_gateway.set_character(&character);
 | 
				
			||||||
    let mut character = entity_gateway.new_character_by_user(&fake_user3);
 | 
					    let mut character = entity_gateway.new_character_by_user(&fake_user3);
 | 
				
			||||||
    character.slot = 2;
 | 
					    character.slot = 2;
 | 
				
			||||||
    character.name = "Test Char 6".into();
 | 
					    character.name = "Test Char 6".into();
 | 
				
			||||||
    entity_gateway.create_guild_card_by_character(&character);
 | 
					 | 
				
			||||||
    entity_gateway.set_character(&character);
 | 
					    entity_gateway.set_character(&character);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let fake_user4 = UserAccount {
 | 
					    let fake_user4 = UserAccount {
 | 
				
			||||||
@ -161,12 +155,10 @@ fn main() {
 | 
				
			|||||||
    entity_gateway.create_user_settings_by_user(&fake_user4);
 | 
					    entity_gateway.create_user_settings_by_user(&fake_user4);
 | 
				
			||||||
    let mut character = entity_gateway.new_character_by_user(&fake_user4);
 | 
					    let mut character = entity_gateway.new_character_by_user(&fake_user4);
 | 
				
			||||||
    character.name = "Test Char 7".into();
 | 
					    character.name = "Test Char 7".into();
 | 
				
			||||||
    entity_gateway.create_guild_card_by_character(&character);
 | 
					 | 
				
			||||||
    entity_gateway.set_character(&character);
 | 
					    entity_gateway.set_character(&character);
 | 
				
			||||||
    let mut character = entity_gateway.new_character_by_user(&fake_user4);
 | 
					    let mut character = entity_gateway.new_character_by_user(&fake_user4);
 | 
				
			||||||
    character.slot = 2;
 | 
					    character.slot = 2;
 | 
				
			||||||
    character.name = "Test Char 8".into();
 | 
					    character.name = "Test Char 8".into();
 | 
				
			||||||
    entity_gateway.create_guild_card_by_character(&character);
 | 
					 | 
				
			||||||
    entity_gateway.set_character(&character);
 | 
					    entity_gateway.set_character(&character);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async_std::task::block_on(async move {
 | 
					    async_std::task::block_on(async move {
 | 
				
			||||||
 | 
				
			|||||||
@ -10,13 +10,14 @@ use libpso::{PacketParseError, PSOPacket};
 | 
				
			|||||||
use libpso::crypto::bb::PSOBBCipher;
 | 
					use libpso::crypto::bb::PSOBBCipher;
 | 
				
			||||||
use libpso::character::character;
 | 
					use libpso::character::character;
 | 
				
			||||||
use libpso::packet::ship::{ROOM_MENU_ID};
 | 
					use libpso::packet::ship::{ROOM_MENU_ID};
 | 
				
			||||||
 | 
					use libpso::{utf8_to_array, utf8_to_utf16_array};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::common::cipherkeys::{ELSEWHERE_PRIVATE_KEY, ELSEWHERE_PARRAY};
 | 
					use crate::common::cipherkeys::{ELSEWHERE_PRIVATE_KEY, ELSEWHERE_PARRAY};
 | 
				
			||||||
use crate::common::serverstate::{SendServerPacket, RecvServerPacket, ServerState, OnConnect, ClientId};
 | 
					use crate::common::serverstate::{SendServerPacket, RecvServerPacket, ServerState, OnConnect, ClientId};
 | 
				
			||||||
use crate::common::leveltable::CharacterLevelTable;
 | 
					use crate::common::leveltable::CharacterLevelTable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::entity::gateway::EntityGateway;
 | 
					use crate::entity::gateway::EntityGateway;
 | 
				
			||||||
use crate::entity::account::{UserAccount, UserSettings, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM, GuildCard};
 | 
					use crate::entity::account::{UserAccount, UserSettings, USERFLAG_NEWCHAR, USERFLAG_DRESSINGROOM};
 | 
				
			||||||
use crate::entity::character::CharacterEntity;
 | 
					use crate::entity::character::CharacterEntity;
 | 
				
			||||||
use crate::entity::item::{ItemLocation, Item};
 | 
					use crate::entity::item::{ItemLocation, Item};
 | 
				
			||||||
use crate::login::login::get_login_status;
 | 
					use crate::login::login::get_login_status;
 | 
				
			||||||
@ -122,21 +123,20 @@ struct ClientState {
 | 
				
			|||||||
    settings: UserSettings,
 | 
					    settings: UserSettings,
 | 
				
			||||||
    character: CharacterEntity,
 | 
					    character: CharacterEntity,
 | 
				
			||||||
    session: Session,
 | 
					    session: Session,
 | 
				
			||||||
    guildcard: GuildCard,
 | 
					    //guildcard: GuildCard,
 | 
				
			||||||
    inventory: items::ActiveInventory,
 | 
					    inventory: items::ActiveInventory,
 | 
				
			||||||
    //bank: Bank,
 | 
					    //bank: Bank,
 | 
				
			||||||
    block: u32,
 | 
					    block: u32,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl ClientState {
 | 
					impl ClientState {
 | 
				
			||||||
    fn new(user: UserAccount, settings: UserSettings, character: CharacterEntity, inventory: items::ActiveInventory, /*bank: Bank,*/ session: Session, guildcard: GuildCard) -> ClientState {
 | 
					    fn new(user: UserAccount, settings: UserSettings, character: CharacterEntity, inventory: items::ActiveInventory, /*bank: Bank,*/ session: Session) -> ClientState {
 | 
				
			||||||
        ClientState {
 | 
					        ClientState {
 | 
				
			||||||
            user: user,
 | 
					            user: user,
 | 
				
			||||||
            settings: settings,
 | 
					            settings: settings,
 | 
				
			||||||
            character: character,
 | 
					            character: character,
 | 
				
			||||||
            session: session,
 | 
					            session: session,
 | 
				
			||||||
            inventory: inventory,
 | 
					            inventory: inventory,
 | 
				
			||||||
            guildcard: guildcard,
 | 
					 | 
				
			||||||
            //bank: bank,
 | 
					            //bank: bank,
 | 
				
			||||||
            block: 1,
 | 
					            block: 1,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@ -181,11 +181,9 @@ impl<EG: EntityGateway> ShipServerState<EG> {
 | 
				
			|||||||
                    .clone();
 | 
					                    .clone();
 | 
				
			||||||
                let settings = self.entity_gateway.get_user_settings_by_user(&user)
 | 
					                let settings = self.entity_gateway.get_user_settings_by_user(&user)
 | 
				
			||||||
                    .ok_or(ShipError::ClientNotFound(id))?;
 | 
					                    .ok_or(ShipError::ClientNotFound(id))?;
 | 
				
			||||||
                let guildcard = self.entity_gateway.get_guild_card_by_character(&character)
 | 
					 | 
				
			||||||
                        .ok_or(ShipError::ClientNotFound(id))?;
 | 
					 | 
				
			||||||
                let inventory = self.item_database.get_character_inventory(&mut self.entity_gateway, &character);
 | 
					                let inventory = self.item_database.get_character_inventory(&mut self.entity_gateway, &character);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                self.clients.insert(id, ClientState::new(user, settings, character, inventory, pkt.session, guildcard));
 | 
					                self.clients.insert(id, ClientState::new(user, settings, character, inventory, pkt.session));
 | 
				
			||||||
                vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(&self.name, 3))]
 | 
					                vec![SendShipPacket::LoginResponse(response), SendShipPacket::ShipBlockList(ShipBlockList::new(&self.name, 3))]
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            Err(err) => {
 | 
					            Err(err) => {
 | 
				
			||||||
@ -331,22 +329,21 @@ impl<EG: EntityGateway> ShipServerState<EG> {
 | 
				
			|||||||
    fn direct_message(&mut self, id: ClientId, msg: &DirectMessage) -> Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send> {
 | 
					    fn direct_message(&mut self, id: ClientId, msg: &DirectMessage) -> Box<dyn Iterator<Item = (ClientId, SendShipPacket)> + Send> {
 | 
				
			||||||
        let cmsg = msg.clone();
 | 
					        let cmsg = msg.clone();
 | 
				
			||||||
        let client = self.clients.get_mut(&id).unwrap();
 | 
					        let client = self.clients.get_mut(&id).unwrap();
 | 
				
			||||||
        let gc = self.entity_gateway.get_guild_card_by_character(&client.character).unwrap();
 | 
					 | 
				
			||||||
        match &cmsg.msg {
 | 
					        match &cmsg.msg {
 | 
				
			||||||
            GameMessage::GuildcardSend(GuildcardSend) => {
 | 
					            GameMessage::GuildcardSend(guildcard_send) => {
 | 
				
			||||||
                let out_msg = DirectMessage{
 | 
					                let out_msg = DirectMessage{
 | 
				
			||||||
                    flag: cmsg.flag,
 | 
					                    flag: cmsg.flag,
 | 
				
			||||||
                    msg: GameMessage::GuildcardRecv(GuildcardRecv {
 | 
					                    msg: GameMessage::GuildcardRecv(GuildcardRecv {
 | 
				
			||||||
                        client: 141,
 | 
					                        client: guildcard_send.client,
 | 
				
			||||||
                        target: 8,
 | 
					                        target: guildcard_send.target,
 | 
				
			||||||
                        guildcard: gc.guildcard.guildcard,
 | 
					                        guildcard: client.user.id,
 | 
				
			||||||
                        name: gc.guildcard.name,
 | 
					                        name: utf8_to_utf16_array!(client.character.name, 0x18),
 | 
				
			||||||
                        team: gc.guildcard.team,
 | 
					                        team: [0; 0x10], // TODO: teams not yet implemented
 | 
				
			||||||
                        desc: gc.guildcard.desc,
 | 
					                        desc: utf8_to_utf16_array!(client.character.guildcard.description, 0x58),
 | 
				
			||||||
                        one: 1,
 | 
					                        one: 1,
 | 
				
			||||||
                        language: gc.guildcard.language,
 | 
					                        language: 0, // TODO: add language flag to character
 | 
				
			||||||
                        section_id: gc.guildcard.section_id,
 | 
					                        section_id: client.character.section_id.into(),
 | 
				
			||||||
                        class: gc.guildcard.class,
 | 
					                        class: client.character.char_class.into(),
 | 
				
			||||||
                    }),
 | 
					                    }),
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                Box::new(self.client_location.get_area_by_user(id).clients().iter()
 | 
					                Box::new(self.client_location.get_area_by_user(id).clients().iter()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user