Example #1
0
        public static bool DeleteCharacter(Player player)
        {
            using (DatabaseContext context = new DatabaseContext())
            {
                Player             character     = context.Characters.Find(player.CharacterId);
                List <Item>        items         = context.Items.Where(x => x.Owner.CharacterId == player.CharacterId).ToList();
                List <Buddy>       buddies       = context.Buddies.Where(x => x.Player.AccountId == player.CharacterId).ToList();
                List <QuestStatus> quests        = context.Quests.Where(x => x.Player.CharacterId == player.CharacterId).ToList();
                List <SkillTab>    skilltabs     = context.SkillTabs.Where(x => x.Player.CharacterId == player.CharacterId).ToList();
                List <Mail>        mails         = context.Mails.Where(x => x.PlayerId == player.CharacterId).ToList();
                List <Inventory>   inventories   = context.Inventories.Where(x => x.Id == player.Inventory.Id).ToList();
                BankInventory      bankInventory = context.BankInventories.First(x => x.Id == player.BankInventory.Id);
                Wallet             wallet        = context.Wallets.First(x => x.Id == player.Wallet.Id);
                Levels             level         = context.Levels.First(x => x.Id == player.Levels.Id);
                GameOptions        gameOptions   = context.GameOptions.First(x => x.Id == player.GameOptions.Id);
                Mailbox            mailBox       = context.MailBoxes.First(x => x.Id == player.Mailbox.Id);

                items.ForEach(x => context.Entry(x).State       = EntityState.Deleted);
                buddies.ForEach(x => context.Entry(x).State     = EntityState.Deleted);
                quests.ForEach(x => context.Entry(x).State      = EntityState.Deleted);
                skilltabs.ForEach(x => context.Entry(x).State   = EntityState.Deleted);
                inventories.ForEach(x => context.Entry(x).State = EntityState.Deleted);
                mails.ForEach(x => context.Entry(x).State       = EntityState.Deleted);
                context.Entry(wallet).State        = EntityState.Deleted;
                context.Entry(bankInventory).State = EntityState.Deleted;
                context.Entry(level).State         = EntityState.Deleted;
                context.Entry(gameOptions).State   = EntityState.Deleted;
                context.Entry(mailBox).State       = EntityState.Deleted;
                context.Entry(character).State     = EntityState.Deleted;

                return(SaveChanges(context));
            }
        }
    private static void HandleMesos(GameSession session, PacketReader packet)
    {
        packet.ReadLong();
        byte          mode          = packet.ReadByte();
        long          amount        = packet.ReadLong();
        Wallet        wallet        = session.Player.Wallet;
        BankInventory bankInventory = session.Player.Account.BankInventory;

        if (mode == 1) // add mesos
        {
            if (wallet.Meso.Modify(-amount))
            {
                bankInventory.Mesos.Modify(amount);
            }
            return;
        }

        if (mode == 0) // remove mesos
        {
            if (bankInventory.Mesos.Modify(-amount))
            {
                wallet.Meso.Modify(amount);
            }
        }
    }
Example #3
0
 public Account(long accountId, dynamic data, BankInventory bankInventory, MushkingRoyaleStats royaleStats, List <Medal> medals, AuthData authData, GameSession gameSession)
 {
     Id                         = accountId;
     Username                   = data.username;
     PasswordHash               = data.password_hash;
     CreationTime               = data.creation_time;
     LastLoginTime              = data.last_login_time;
     CharacterSlots             = data.character_slots;
     Meret                      = new(CurrencyType.Meret, data.meret, gameSession);
     GameMeret                  = new(CurrencyType.GameMeret, data.game_meret, gameSession);
     EventMeret                 = new(CurrencyType.EventMeret, data.event_meret, gameSession);
     MesoToken                  = new(CurrencyType.MesoToken, data.meso_token, gameSession);
     BankInventory              = bankInventory;
     MushkingRoyaleStats        = royaleStats;
     VIPExpiration              = data.vip_expiration;
     HomeId                     = data.home_id ?? 0;
     MesoMarketDailyListings    = data.meso_market_daily_listings;
     MesoMarketMonthlyPurchases = data.meso_market_monthly_purchases;
     AuthData                   = authData;
     EquippedMedals             = new()
     {
         {
             MedalSlot.Tail,
             null
         },
         {
             MedalSlot.GroundMount,
             null
         },
Example #4
0
 public Account(long accountId, string username, string passwordHash,
                long creationTime, long lastLoginTime, int characterSlots, long meretAmount,
                long gameMeretAmount, long eventMeretAmount, long mesoTokens, long homeId, long vipExpiration, int mesoMarketDailyListings, int mesoMarketMonthlyPurchases,
                BankInventory bankInventory, MushkingRoyaleStats royaleStats, List <Medal> medals, AuthData authData, GameSession gameSession)
 {
     Id                         = accountId;
     Username                   = username;
     PasswordHash               = passwordHash;
     CreationTime               = creationTime;
     LastLoginTime              = lastLoginTime;
     CharacterSlots             = characterSlots;
     Meret                      = new(CurrencyType.Meret, meretAmount, gameSession);
     GameMeret                  = new(CurrencyType.GameMeret, gameMeretAmount, gameSession);
     EventMeret                 = new(CurrencyType.EventMeret, eventMeretAmount, gameSession);
     MesoToken                  = new(CurrencyType.MesoToken, mesoTokens, gameSession);
     BankInventory              = bankInventory;
     MushkingRoyaleStats        = royaleStats;
     VIPExpiration              = vipExpiration;
     HomeId                     = homeId;
     MesoMarketDailyListings    = mesoMarketDailyListings;
     MesoMarketMonthlyPurchases = mesoMarketMonthlyPurchases;
     AuthData                   = authData;
     EquippedMedals             = new()
     {
         { MedalSlot.Tail, null },
         { MedalSlot.GroundMount, null },
Example #5
0
 public long Insert(BankInventory bankInventory)
 {
     return(QueryFactory.Query(TableName).InsertGetId <long>(new
     {
         mesos = bankInventory.Mesos.Amount,
         extra_size = bankInventory.ExtraSize,
     }));
 }
Example #6
0
    private static Account ReadAccount(dynamic data)
    {
        BankInventory       bankInventory = DatabaseManager.BankInventories.FindById(data.bank_inventory_id);
        MushkingRoyaleStats royaleStats   = DatabaseManager.MushkingRoyaleStats.FindById(data.mushking_royale_id);
        List <Medal>        medals        = DatabaseManager.MushkingRoyaleMedals.FindAllByAccountId(data.id);

        return(new(data.id, data, bankInventory, royaleStats, medals, null, null));
    }
Example #7
0
        private static Account ReadAccount(dynamic data)
        {
            BankInventory bankInventory = DatabaseManager.BankInventories.FindById(data.bank_inventory_id);

            return(new Account(data.id, data.username, data.password_hash, data.creation_time, data.last_login_time,
                               data.character_slots, data.meret, data.game_meret, data.event_meret, data.meso_token, data.home_id ?? 0,
                               data.vip_expiration, bankInventory));
        }
Example #8
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="accountId"></param>
 /// <returns></returns>
 public BankInventory GetBankByAccountId(long accountId)
 {
     if (!m_bankByAccountId.ContainsKey(accountId))
     {
         var bank = new BankInventory(BankRepository.Instance.GetByAccountId(accountId));
         m_bankByAccountId.Add(accountId, bank);
         return(bank);
     }
     return(m_bankByAccountId[accountId]);
 }
Example #9
0
 public Player()
 {
     Type      |= ObjectTypes.Player;
     inventory  = new PlayerInventory(this, (UpdateFields.PLAYER_FARSIGHT - UpdateFields.PLAYER_FIELD_INV_SLOT_HEAD) / 2);
     _equipment = new EquipmentInventory(this);
     _backPack  = new BackPackInventory(this);
     _bank      = new BankInventory(this);
     _bankBags  = new BankBagsInventory(this);
     _keyRing   = new KeyRingInventory(this);
 }
Example #10
0
    private static Account ReadAccount(dynamic data)
    {
        BankInventory       bankInventory = DatabaseManager.BankInventories.FindById(data.bank_inventory_id);
        MushkingRoyaleStats royaleStats   = DatabaseManager.MushkingRoyaleStats.FindById(data.mushking_royale_id);
        List <Medal>        medals        = DatabaseManager.MushkingRoyaleMedals.FindAllByAccountId(data.id);

        return(new Account(data.id, data.username, data.password_hash, data.creation_time, data.last_login_time,
                           data.character_slots, data.meret, data.game_meret, data.event_meret, data.meso_token, data.home_id ?? 0,
                           data.vip_expiration, data.meso_market_daily_listings, data.meso_market_monthly_purchases, bankInventory, royaleStats, medals, null));
    }
Example #11
0
        /// <summary>
        /// Sends OpenBank to creature's client.
        /// </summary>
        /// <param name="creature"></param>
        /// <param name="bank"></param>
        /// <param name="race"></param>
        public static void OpenBank(Creature creature, BankInventory bank, BankTabRace race, string bankId, string bankTitle)
        {
            var packet = new Packet(Op.OpenBank, creature.EntityId);

            packet.PutByte(1);
            packet.PutByte((byte)race);
            packet.PutLong(DateTime.Now);
            packet.PutByte(0);
            packet.PutString(creature.Client.Account.Id);
            packet.PutString(bankId);
            packet.PutString(bankTitle);
            packet.PutInt(bank.Gold);

            var server = creature.Client.Account.Characters.FirstOrDefault(c => c.EntityId == packet.Id).Server;

            var tabList = bank.GetTabList(server, race);

            packet.PutInt(tabList.Count);
            foreach (var tab in tabList)
            {
                packet.PutString(tab.Name);
                packet.PutByte((byte)tab.Race);

                // [190200, NA204 (2015-05-19)] ?
                // Haven't opened a bank in a while, could've been
                // added earlier. -- exec
                {
                    packet.PutInt(0);
                }

                packet.PutInt(tab.Width);
                packet.PutInt(tab.Height);

                var itemList = tab.GetItemList();
                packet.PutInt(itemList.Count);
                foreach (var item in itemList)
                {
                    packet.PutString(item.Bank);
                    packet.PutLong(item.BankTransferRemaining);
                    packet.PutLong(item.BankTransferStart);
                    packet.AddItemInfo(item, ItemPacketType.Private);
                }
            }

            creature.Client.Send(packet);
        }
Example #12
0
        /// <summary>
        /// Sends OpenBank to creature's client.
        /// </summary>
        /// <param name="creature"></param>
        /// <param name="bank"></param>
        /// <param name="race"></param>
        public static void OpenBank(Creature creature, BankInventory bank, BankTabRace race)
        {
            var packet = new Packet(Op.OpenBank, creature.EntityId);

            packet.PutByte(1);
            packet.PutByte((byte)race);
            packet.PutLong(DateTime.Now);
            packet.PutByte(0);
            packet.PutString(creature.Client.Account.Id);
            packet.PutString("Global");           // Current bank id
            packet.PutString("Bank");             // Current bank title
            packet.PutInt(bank.Gold);

            var tabList = bank.GetTabList(race);

            packet.PutInt(tabList.Count);
            foreach (var tab in tabList)
            {
                packet.PutString(tab.Name);
                packet.PutByte((byte)tab.Race);

                // [190200, NA204 (2015-05-19)] ?
                // Haven't opened a bank in a while, could've been
                // added earlier. -- exec
                {
                    packet.PutInt(0);
                }

                packet.PutInt(tab.Width);
                packet.PutInt(tab.Height);

                var itemList = tab.GetItemList();
                packet.PutInt(itemList.Count);
                foreach (var item in itemList)
                {
                    packet.PutString("Global");                     // Bank id
                    packet.PutULong(18446744017659355058);
                    packet.PutULong(0);
                    packet.AddItemInfo(item, ItemPacketType.Private);
                }
            }

            creature.Client.Send(packet);
        }
Example #13
0
        public static void UpdateItems(Player player)
        {
            Inventory inventory = player.Inventory;

            inventory.DB_Items = inventory.Items.Values.Where(x => x != null).ToList();
            inventory.DB_Items.AddRange(inventory.Equips.Values.Where(x => x != null).ToList());
            inventory.DB_Items.AddRange(inventory.Cosmetics.Values.Where(x => x != null).ToList());

            BankInventory bankInventory = player.BankInventory;

            bankInventory.DB_Items = bankInventory.Items.Where(x => x != null).ToList();

            using (DatabaseContext context = new DatabaseContext())
            {
                foreach (Item item in inventory.DB_Items)
                {
                    Item dbItem = context.Items.Include(x => x.Inventory).Include(x => x.BankInventory).FirstOrDefault(x => x.Uid == item.Uid);
                    if (dbItem == null)
                    {
                        item.Inventory            = inventory;
                        context.Entry(item).State = EntityState.Added;
                        continue;
                    }
                    item.BankInventory   = null;
                    dbItem.BankInventory = null;
                    context.Entry(dbItem).CurrentValues.SetValues(item);
                }

                foreach (Item item in bankInventory.DB_Items)
                {
                    Item dbItem = context.Items.Include(x => x.Inventory).Include(x => x.BankInventory).FirstOrDefault(x => x.Uid == item.Uid);
                    if (dbItem == null)
                    {
                        item.BankInventory        = bankInventory;
                        context.Entry(item).State = EntityState.Added;
                        continue;
                    }
                    item.Inventory   = null;
                    dbItem.Inventory = null;
                    context.Entry(dbItem).CurrentValues.SetValues(item);
                }
                SaveChanges(context);
            }
        }
Example #14
0
        public void Update(BankInventory bankInventory)
        {
            QueryFactory.Query(TableName).Where("id", bankInventory.Id).Update(new
            {
                mesos      = bankInventory.Mesos.Amount,
                extra_size = bankInventory.ExtraSize,
            });

            List <Item> items = new List <Item>();

            items.AddRange(bankInventory.Items.Where(item => item != null).ToList());
            foreach (Item item in items)
            {
                item.BankInventoryId = bankInventory.Id;
                item.InventoryId     = 0;
                item.HomeId          = 0;
                DatabaseManager.Items.Update(item);
            }
        }
Example #15
0
 private static void HandleClose(BankInventory bankInventory)
 {
     DatabaseManager.BankInventories.Update(bankInventory);
 }
    /// <summary>
    /// Return the full player with the given id, with Hotbars, SkillTabs, Inventories, etc.
    /// </summary>
    /// <returns>Player</returns>
    public Player FindPlayerById(long characterId, GameSession session)
    {
        dynamic data = QueryFactory.Query(TableName).Where("character_id", characterId)
                       .Join("levels", "levels.id", "characters.levels_id")
                       .Join("accounts", "accounts.id", "characters.account_id")
                       .Join("game_options", "game_options.id", "characters.game_options_id")
                       .Join("wallets", "wallets.id", "characters.wallet_id")
                       .Join("auth_data", "auth_data.account_id", "characters.account_id")
                       .LeftJoin("homes", "homes.account_id", "accounts.id")
                       .Select(
            "characters.{*}",
            "levels.{level, exp, rest_exp, prestige_level, prestige_exp, mastery_exp}",
            "accounts.{username, password_hash, creation_time, last_log_time, character_slots, meret, game_meret, event_meret, meso_token, bank_inventory_id, mushking_royale_id, vip_expiration, meso_market_daily_listings, meso_market_monthly_purchases}",
            "game_options.{keybinds, active_hotbar_id}",
            "wallets.{meso, valor_token, treva, rue, havi_fruit}",
            "homes.id as home_id",
            "auth_data.{token_a, token_b, online_character_id}")
                       .FirstOrDefault();

        List <Hotbar>            hotbars         = DatabaseManager.Hotbars.FindAllByGameOptionsId(data.game_options_id);
        List <Macro>             macros          = DatabaseManager.Macros.FindAllByCharacterId(data.character_id);
        List <SkillTab>          skillTabs       = DatabaseManager.SkillTabs.FindAllByCharacterId(data.character_id, data.job);
        IInventory               inventory       = DatabaseManager.Inventories.FindById(data.inventory_id);
        BankInventory            bankInventory   = DatabaseManager.BankInventories.FindById(data.bank_inventory_id);
        MushkingRoyaleStats      royaleStats     = DatabaseManager.MushkingRoyaleStats.FindById(data.mushking_royale_id);
        List <Medal>             medals          = DatabaseManager.MushkingRoyaleMedals.FindAllByAccountId(data.account_id);
        Dictionary <int, Trophy> trophies        = DatabaseManager.Trophies.FindAllByCharacterId(data.character_id);
        List <ClubMember>        clubMemberships = DatabaseManager.ClubMembers.FindAllClubIdsByCharacterId(data.character_id);

        foreach (KeyValuePair <int, Trophy> trophy in DatabaseManager.Trophies.FindAllByAccountId(data.account_id))
        {
            trophies.Add(trophy.Key, trophy.Value);
        }

        Dictionary <int, QuestStatus> questList = DatabaseManager.Quests.FindAllByCharacterId(data.character_id);
        AuthData authData = new(data.token_a, data.token_b, data.account_id, data.online_character_id ?? 0);

        return(new()
        {
            Session = session,
            CharacterId = data.character_id,
            AccountId = data.account_id,
            Account = new(data.account_id, data, bankInventory, royaleStats, medals, authData, session),
            CreationTime = data.creation_time,
            Birthday = data.birthday,
            Name = data.name,
            Gender = (Gender)data.gender,
            Awakened = data.awakened,
            ChannelId = data.channel_id,
            InstanceId = data.instance_id,
            IsMigrating = data.is_migrating,
            Job = (Job)data.job,
            Levels = new(data.level, data.exp, data.rest_exp, data.prestige_level, data.prestige_exp,
                         JsonConvert.DeserializeObject <List <MasteryExp> >(data.mastery_exp), session, data.levels_id),
            MapId = data.map_id,
            TitleId = data.title_id,
            InsigniaId = data.insignia_id,
            Titles = JsonConvert.DeserializeObject <List <int> >(data.titles),
            PrestigeRewardsClaimed = JsonConvert.DeserializeObject <List <int> >(data.prestige_rewards_claimed),
            PrestigeMissions = JsonConvert.DeserializeObject <List <PrestigeMission> >(data.prestige_missions),
            GearScore = data.gear_score,
            MaxSkillTabs = data.max_skill_tabs,
            ActiveSkillTabId = data.active_skill_tab_id,
            GameOptions = new GameOptions(JsonConvert.DeserializeObject <Dictionary <int, KeyBind> >(data.keybinds),
                                          hotbars, data.active_hotbar_id, data.game_options_id),
            Macros = macros,
            Wallet = new Wallet(data.meso, data.valor_token, data.treva, data.rue, data.havi_fruit, session, data.wallet_id),
            Inventory = inventory,
            ChatSticker = JsonConvert.DeserializeObject <List <ChatSticker> >(data.chat_sticker),
            SavedCoord = JsonConvert.DeserializeObject <CoordF>(data.coord),
            Emotes = JsonConvert.DeserializeObject <List <int> >(data.emotes),
            FavoriteStickers = JsonConvert.DeserializeObject <List <int> >(data.favorite_stickers),
            GuildApplications = JsonConvert.DeserializeObject <List <GuildApplication> >(data.guild_applications),
            GuildId = data.guild_id ?? 0,
            ClubMembers = clubMemberships,
            IsDeleted = data.is_deleted,
            Motto = data.motto,
            ProfileUrl = data.profile_url,
            ReturnCoord = JsonConvert.DeserializeObject <CoordF>(data.return_coord),
            ReturnMapId = data.return_map_id,
            SkinColor = JsonConvert.DeserializeObject <SkinColor>(data.skin_color),
            StatPointDistribution = JsonConvert.DeserializeObject <StatDistribution>(data.statpoint_distribution),
            Stats = JsonConvert.DeserializeObject <Stats>(data.stats),
            TrophyCount = JsonConvert.DeserializeObject <int[]>(data.trophy_count),
            UnlockedMaps = JsonConvert.DeserializeObject <List <int> >(data.unlocked_maps),
            UnlockedTaxis = JsonConvert.DeserializeObject <List <int> >(data.unlocked_taxis),
            VisitingHomeId = data.visiting_home_id,
            SkillTabs = skillTabs,
            TrophyData = trophies,
            QuestData = questList,
            GatheringCount = JsonConvert.DeserializeObject <List <GatheringCount> >(data.gathering_count),
            ActivePet = DatabaseManager.Items.FindByUid(data.active_pet_item_uid)
        });
    }
        /// <summary>
        /// Return the full player with the given id, with Hotbars, SkillTabs, Inventories, etc.
        /// </summary>
        /// <returns>Player</returns>
        public Player FindPlayerById(long characterId)
        {
            dynamic data = QueryFactory.Query(TableName).Where("character_id", characterId)
                           .Join("levels", "levels.id", "characters.levels_id")
                           .Join("accounts", "accounts.id", "characters.account_id")
                           .Join("game_options", "game_options.id", "characters.game_options_id")
                           .Join("wallets", "wallets.id", "characters.wallet_id")
                           .LeftJoin("homes", "homes.account_id", "accounts.id")
                           .Select(
                "characters.{*}",
                "levels.{level, exp, rest_exp, prestige_level, prestige_exp, mastery_exp}",
                "accounts.{username, password_hash, creation_time, last_login_time, character_slots, meret, game_meret, event_meret, meso_token, bank_inventory_id, vip_expiration}",
                "game_options.{keybinds, active_hotbar_id}",
                "wallets.{meso, valor_token, treva, rue, havi_fruit}",
                "homes.id as home_id")
                           .FirstOrDefault();

            List <Hotbar>            hotbars       = DatabaseManager.Hotbars.FindAllByGameOptionsId(data.game_options_id);
            List <SkillTab>          skillTabs     = DatabaseManager.SkillTabs.FindAllByCharacterId(data.character_id, data.job);
            Inventory                inventory     = DatabaseManager.Inventories.FindById(data.inventory_id);
            BankInventory            bankInventory = DatabaseManager.BankInventories.FindById(data.bank_inventory_id);
            Dictionary <int, Trophy> trophies      = DatabaseManager.Trophies.FindAllByCharacterId(data.character_id);

            foreach (KeyValuePair <int, Trophy> trophy in DatabaseManager.Trophies.FindAllByAccountId(data.account_id))
            {
                trophies.Add(trophy.Key, trophy.Value);
            }
            List <QuestStatus> questList = DatabaseManager.Quests.FindAllByCharacterId(data.character_id);

            return(new Player()
            {
                CharacterId = data.character_id,
                AccountId = data.account_id,
                Account = new Account(data.account_id, data.username, data.password_hash, data.creation_time, data.last_login_time, data.character_slots,
                                      data.meret, data.game_meret, data.event_meret, data.meso_token, data.home_id ?? 0, data.vip_expiration, bankInventory),
                CreationTime = data.creation_time,
                Name = data.name,
                Gender = data.gender,
                Awakened = data.awakened,
                Job = (Job)data.job,
                Levels = new Levels(data.level, data.exp, data.rest_exp, data.prestige_level, data.prestige_exp, JsonConvert.DeserializeObject <List <MasteryExp> >(data.mastery_exp), data.levels_id),
                MapId = data.map_id,
                TitleId = data.title_id,
                InsigniaId = data.insignia_id,
                Titles = JsonConvert.DeserializeObject <List <int> >(data.titles),
                PrestigeRewardsClaimed = JsonConvert.DeserializeObject <List <int> >(data.prestige_rewards_claimed),
                MaxSkillTabs = data.max_skill_tabs,
                ActiveSkillTabId = data.active_skill_tab_id,
                GameOptions = new GameOptions(JsonConvert.DeserializeObject <Dictionary <int, KeyBind> >(data.keybinds), hotbars, data.active_hotbar_id, data.game_options_id),
                Wallet = new Wallet(data.meso, data.valor_token, data.treva, data.rue, data.havi_fruit, data.wallet_id),
                Inventory = inventory,
                ChatSticker = JsonConvert.DeserializeObject <List <ChatSticker> >(data.chat_sticker),
                ClubId = data.club_id,
                Coord = JsonConvert.DeserializeObject <CoordF>(data.coord),
                Emotes = JsonConvert.DeserializeObject <List <int> >(data.emotes),
                FavoriteStickers = JsonConvert.DeserializeObject <List <int> >(data.favorite_stickers),
                GroupChatId = JsonConvert.DeserializeObject <int[]>(data.group_chat_id),
                GuildApplications = JsonConvert.DeserializeObject <List <GuildApplication> >(data.guild_applications),
                GuildId = data.guild_id ?? 0,
                IsDeleted = data.is_deleted,
                Mapleopoly = JsonConvert.DeserializeObject <Mapleopoly>(data.mapleopoly),
                Motto = data.motto,
                ProfileUrl = data.profile_url,
                ReturnCoord = JsonConvert.DeserializeObject <CoordF>(data.return_coord),
                ReturnMapId = data.return_map_id,
                SkinColor = JsonConvert.DeserializeObject <SkinColor>(data.skin_color),
                StatPointDistribution = JsonConvert.DeserializeObject <StatDistribution>(data.statpoint_distribution),
                Stats = JsonConvert.DeserializeObject <PlayerStats>(data.stats),
                TrophyCount = JsonConvert.DeserializeObject <int[]>(data.trophy_count),
                UnlockedMaps = JsonConvert.DeserializeObject <List <int> >(data.unlocked_maps),
                UnlockedTaxis = JsonConvert.DeserializeObject <List <int> >(data.unlocked_taxis),
                VisitingHomeId = data.visiting_home_id,
                SkillTabs = skillTabs,
                TrophyData = trophies,
                QuestList = questList
            });
        }