void C2S_CS_CREATE_CHARACTER(NetworkPacket packet)
        {
            var db       = ServiceContainer.GetService <IDatabase>();
            var ccItems  = GameResources.Instance.CCItemSets;
            var universe = GameResources.Instance.Universe;
            var map      = ServiceContainer.GetService <IMapLoader>().GetPersistentMap(universe.EntryWorld.worldID);
            var start    = map.Find <PlayerStart>(playerStart => playerStart.NavigationTag.Equals(universe.EntryPortal.Tag));

            if (start == null)
            {
                throw new NullReferenceException("Entry portal is null");
            }

            var lod0      = packet.ReadByteArray();
            var lod1      = packet.ReadByteArray();
            var lod2      = packet.ReadByteArray();
            var lod3      = packet.ReadByteArray();
            var name      = packet.ReadString();
            var archeType = packet.ReadInt32();

            var skillDeck = new DB_SkillDeck();

            skillDeck.Id    = db.Characters.AllocateSkillDeckID();
            skillDeck.mName = name; //TODO investigate - probably wrong
            for (var i = 0; i < 5; i++)
            {
                skillDeck.mSkills.Add(packet.ReadInt32());
            }

            var shieldIndicator = packet.ReadInt32();

            Debug.Log("Shield: " + shieldIndicator);
            //Lods parsing
            Array.Reverse(lod0);
            Array.Reverse(lod1);
            Array.Reverse(lod2);
            Array.Reverse(lod3);
            //lod0
            var rightGauntletColour1 = lod0[5];
            var rightGauntletColour2 = lod0[6];
            var leftGauntletColour1  = lod0[7];
            var leftGauntletColour2  = lod0[8];
            var rightGloveColour1    = lod0[9];
            var rightGloveColour2    = lod0[10];
            var leftGloveColour1     = lod0[11];
            var leftGloveColour2     = lod0[12];
            //Lod0 rest
            var voiceId          = lod0[0]; //
            var rightArmTattooId = (byte)(lod0[3] & 0x0F);
            var chestTattooId    = (byte)(lod0[4] & 0x0F);
            var leftArmTattooId  = (byte)((lod0[4] & 0xF0) >> 4);
            //Lod1
            var shinRightColour1     = lod1[0];
            var shinRightColour2     = lod1[1];
            var shinLeftColour1      = lod1[2];
            var shinLeftColour2      = lod1[3];
            var thighRightColour1    = lod1[4];
            var thighRightColour2    = lod1[5];
            var thighLeftColour1     = lod1[6];
            var thighLeftColour2     = lod1[7];
            var beltColour1          = lod1[8];
            var beltColour2          = lod1[9];
            var rightShoulderColour1 = lod1[10];
            var rightShoudlerColour2 = lod1[11];
            var leftShoulderColour1  = lod1[12];
            var leftShoulderColour2  = lod1[13];
            var helmetColour1        = lod1[14];
            var helmetColour2        = lod1[15];
            var shoesColour1         = lod1[16];
            var shoesColour2         = lod1[17];
            var pantsColour1         = lod1[18];
            var pantsColour2         = lod1[19];
            //Lod2
            var rangedWeaponId  = (byte)(((lod2[1] & 0x0F) << 2) | ((lod2[2] & 0xC0) >> 6));
            var shieldId        = (byte)(((lod2[2] & 0x3F) << 2) | ((lod2[3] & 0xC0) >> 6));
            var meleeWeaponId   = (byte)(((lod2[3] & 0x3F) << 2) | ((lod2[4] & 0xC0) >> 6));
            var shinRightId     = (byte)(lod2[4] & 0x3F);
            var shinLeftId      = (byte)((lod2[5] & 0xFC) >> 2);
            var thighRightId    = (byte)(((lod2[5] & 0x03) << 4) | ((lod2[6] & 0xF0) >> 4));
            var thighLeftId     = (byte)(((lod2[6] & 0x0F) << 2) | ((lod2[7] & 0xC0) >> 6));
            var beltId          = (byte)(lod2[7] & 0x3F);
            var gauntletRightId = (byte)((lod2[8] & 0xFC) >> 2);
            var gauntletLeftId  = (byte)(((lod2[8] & 0x03) << 4) | ((lod2[9] & 0xF0) >> 4));
            var shoulderRightId = (byte)(((lod2[9] & 0x0F) << 2) | ((lod2[10] & 0xC0) >> 6));
            var shoulderLeftId  = (byte)(lod2[10] & 0x3F);
            var helmetId        = (byte)((lod2[11] & 0xFC) >> 2);
            var shoesId         = (byte)(((lod2[11] & 0x03) << 5) | ((lod2[12] & 0xF8) >> 3));
            var pantsId         = (byte)(((lod2[12] & 0x07) << 4) | ((lod2[13] & 0xF0) >> 4));
            var gloveRightId    = (byte)(((lod2[13] & 0x0F) << 2) | ((lod2[14] & 0xC0) >> 6));
            var gloveLeftId     = (byte)(lod2[14] & 0x3F);
            //Lod3
            var chestArmourColour1 = (byte)(((lod3[0] & 0xFE) << 1) | (lod3[1] >> 7));
            var chestArmourColour2 = (byte)(((lod3[1] & 0x7F) << 1) | (lod3[2] >> 7));
            var chestArmourId      = (byte)((lod3[2] & 0x7E) >> 1);
            var chestClothColour1  = (byte)((lod3[2] << 7) | (lod3[3] >> 1));
            var chestClothColour2  = (byte)((lod3[3] << 7) | (lod3[4] >> 1));
            var chestClothID       = (byte)((lod3[4] << 7) | (lod3[5] >> 1));
            var hairColour         = (byte)((lod3[5] << 7) | (lod3[6] >> 1));
            var hairStyleId        = (byte)(((lod3[6] & 0x01) << 5) | (lod3[7] >> 3));
            var bodyColour         = (byte)((lod3[7] << 5) | (lod3[8] >> 3));
            var headTypeId         = (byte)(((lod3[8] & 0x07) << 4) | ((lod3[9] & 0xF0) >> 4));
            var bodyTypeId         = (byte)((lod3[9] & 0x0C) >> 2);
            var genderId           = (byte)((lod3[9] & 0x02) >> 1);
            var raceId             = (byte)(lod3[9] & 0x01);

            var dbChar = new DB_Character
            {
                Id                = db.Characters.AllocateCharacterID(),
                Name              = name,
                AccountID         = Account.UID,
                Dead              = (byte)Game_Pawn.EPawnStates.PS_ALIVE,
                FactionId         = 77467, //Enclave (correct?)
                LastUsedTimestamp = DatabaseUtility.GetUnixTimestamp(DateTime.Now),
                Location          = UnitConversion.ToUnreal(start.transform.position),
                Rotation          = start.Rotation,
                Money             = 0,
                worldID           = (int)map.ID
            };

            AppearancePackUtility.Pack(
                raceId, genderId, bodyTypeId, headTypeId, bodyColour, chestTattooId, leftArmTattooId, rightArmTattooId,
                hairStyleId, hairColour, voiceId, out dbChar.AppearancePart1, out dbChar.AppearancePart2);

            var items = new List <DB_Item>();

            if (shoesId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.ShoesSet, shoesId, dbChar.Id, shoesColour1, shoesColour2));
            }
            if (pantsId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.PantsSet, pantsId, dbChar.Id, pantsColour1, pantsColour2));
            }
            if (chestClothID > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.ChestClothesSet, chestClothID, dbChar.Id, chestClothColour1, chestClothColour2));
            }
            if (chestArmourId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.ChestSet, chestArmourId, dbChar.Id, chestArmourColour1, chestArmourColour2));
            }
            if (beltId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.BeltSet, beltId, dbChar.Id, beltColour1, beltColour2));
            }
            if (helmetId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.HeadGearSet, helmetId, dbChar.Id, helmetColour1, helmetColour2));
            }
            if (shinLeftId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.LeftShinSet, shinLeftId, dbChar.Id, shinLeftColour1, shinLeftColour2));
            }
            if (shinRightId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.RightShinSet, shinRightId, dbChar.Id, shinRightColour1, shinRightColour2));
            }
            if (shoulderLeftId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.LeftShoulderSet, shoulderLeftId, dbChar.Id, leftShoulderColour1, leftShoulderColour2));
            }
            if (shoulderRightId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.RightShoulderSet, shoulderRightId, dbChar.Id, rightShoulderColour1, rightShoudlerColour2));
            }
            if (thighLeftId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.LeftThighSet, thighLeftId, dbChar.Id, thighLeftColour1, thighLeftColour2));
            }
            if (thighRightId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.RightThighSet, thighRightId, dbChar.Id, thighRightColour1, thighRightColour2));
            }
            if (gloveLeftId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.LeftGloveSet, gloveLeftId, dbChar.Id, leftGloveColour1, leftGloveColour2));
            }
            if (gloveRightId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.RightGloveSet, gloveRightId, dbChar.Id, rightGloveColour1, rightGloveColour2));
            }
            if (gauntletLeftId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.LeftGauntletSet, gauntletLeftId, dbChar.Id, leftGauntletColour1, leftGauntletColour2));
            }
            if (gauntletRightId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.RightGauntletSet, gauntletRightId, dbChar.Id, rightGauntletColour1, rightGauntletColour2));
            }
            if (meleeWeaponId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.MainWeaponSet, meleeWeaponId, dbChar.Id, 0, 0));
            }
            if (rangedWeaponId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.MainWeaponSet, rangedWeaponId, dbChar.Id, 0, 0));
            }
            if (shieldId > 0)
            {
                items.Add(CreateDBItemFromItemSet(ccItems.OffhandWeaponSet, shieldId, dbChar.Id, 0, 0));
            }

            var charSheet = new DB_CharacterSheet
            {
                ClassId             = archeType,
                ExtraBodyPoints     = 0,
                ExtraMindPoints     = 0,
                ExtraFocusPoints    = 0,
                FamePoints          = 0,
                Health              = 100,
                PepPoints           = 0,
                SelectedSkilldeckID = skillDeck.Id
            };

            if (!db.Characters.Save(new Database.DBPlayerCharacter(dbChar, charSheet)) ||
                !db.Characters.Save(skillDeck) ||
                !db.Characters.Save(items))
            {
                Debug.LogError("Error saving newly created character for " + Account.Name);
                var outMsg = GameHeader.S2C_CS_CREATE_CHARACTER_ACK.CreatePacket();
                outMsg.WriteInt32((int)PacketStatusCode.UNKNOWN_ERROR);
                Connection.SendMessage(outMsg);
            }
            else
            {
                Debug.Log(string.Format("Character '{0}' created for {1}", dbChar.Name, Account.Name));
                var outMsg = GameHeader.S2C_CS_CREATE_CHARACTER_ACK.CreatePacket();
                outMsg.WriteInt32((int)PacketStatusCode.NO_ERROR);
                outMsg.Write(dbChar);
                outMsg.Write(charSheet);
                outMsg.Write(items);
                Connection.SendMessage(outMsg);
            }
        }