Пример #1
0
        public void RequestCreateCharacterInSlot(Client client, RequestCreateCharacterInSlotPacket packet)
        {
            var result = packet.CheckName();

            if (result != CreateCharacterResult.Success)
            {
                SendCharacterCreateFailed(client, result);
                return;
            }

            // todo: save the character to the DB

            SendCharacterCreateSuccess(client, packet.SlotNum, packet.FamilyName);
        }
Пример #2
0
        private uint?InternalCreate(Client client, RequestCreateCharacterInSlotPacket packet, ICharUnitOfWork unitOfWork)
        {
            var changeFamilyName = false;

            if (!string.IsNullOrWhiteSpace(client.AccountEntry.FamilyName) && packet.FamilyName != client.AccountEntry.FamilyName)
            {
                if (!client.AccountEntry.Characters.Any())
                {
                    changeFamilyName = true;
                }
                else
                {
                    SendCharacterCreateFailed(client, CreateCharacterResult.InvalidCharacterName);
                    return(null);
                }
            }

            if ((string.IsNullOrWhiteSpace(client.AccountEntry.FamilyName) || packet.FamilyName != client.AccountEntry.FamilyName))
            {
                if (!unitOfWork.GameAccounts.CanChangeFamilyName(client.AccountEntry.Id, packet.FamilyName))
                {
                    SendCharacterCreateFailed(client, CreateCharacterResult.FamilyNameReserved);
                    return(null);
                }
            }

            var characterEntry = unitOfWork.Characters.Create(client.AccountEntry, packet.SlotNum,
                                                              packet.CharacterName,
                                                              (byte)packet.RaceId,
                                                              packet.Scale,
                                                              packet.Gender);

            if (characterEntry == null)
            {
                SendCharacterCreateFailed(client, CreateCharacterResult.TechnicalDifficulty);
                return(null);
            }

            var appearances = CreateCharacterAppearanceEntries(packet);

            unitOfWork.CharacterAppearances.Add(characterEntry, appearances);

            if (string.IsNullOrWhiteSpace(client.AccountEntry.FamilyName) || changeFamilyName)
            {
                unitOfWork.GameAccounts.UpdateFamilyName(client.AccountEntry.Id, packet.FamilyName);
            }

            return(characterEntry.Id);
        }
Пример #3
0
        public void RequestCreateCharacterInSlot(Client client, RequestCreateCharacterInSlotPacket packet)
        {
            var result = packet.Validate();

            if (result != CreateCharacterResult.Success)
            {
                SendCharacterCreateFailed(client, result);
                return;
            }

            uint characterId;

            using var unitOfWork = _gameUnitOfWorkFactory.CreateChar();

            // TODO to remove this lock, the family name check and update must be redesigned to be thread safe
            lock (_createLock)
            {
                var createdCharacterId = InternalCreate(client, packet, unitOfWork);

                if (createdCharacterId == null)
                {
                    return;
                }

                characterId = createdCharacterId.Value;
            }

            unitOfWork.Complete();

            client.CallMethod(SysEntity.ClientMethodId, new CharacterCreateSuccessPacket(packet.SlotNum, packet.FamilyName));

            client.ReloadGameAccountEntry();

            var character = unitOfWork.Characters.Get(characterId);

            SendCharacterInfo(client, packet.SlotNum, character);
        }
Пример #4
0
 private void RequestCreateCharacterInSlot(RequestCreateCharacterInSlotPacket packet)
 {
     CharacterManager.Instance.RequestCreateCharacterInSlot(Client, packet);
 }
Пример #5
0
        private IEnumerable <CharacterAppearanceEntry> CreateCharacterAppearanceEntries(RequestCreateCharacterInSlotPacket packet)
        {
            yield return(new CharacterAppearanceEntry((uint)EquipmentData.Shoes, (uint)EntityClass.ArmorRecruitV01CMNBoots, 2139062144));

            yield return(new CharacterAppearanceEntry((uint)EquipmentData.Torso, (uint)EntityClass.ArmorRecruitV01CMNVest, 2139062144));

            yield return(new CharacterAppearanceEntry((uint)EquipmentData.Legs, (uint)EntityClass.ArmorRecruitV01CMNLegs, 2139062144));

            using var worldUnitOfWork = _gameUnitOfWorkFactory.CreateWorld();
            var appearancesFromPacket = packet.AppearanceData
                                        .Select(appearanceData => CreateCharacterAppearanceEntry(appearanceData.Value, worldUnitOfWork))
                                        .ToList();

            foreach (var characterAppearanceEntry in appearancesFromPacket)
            {
                yield return(characterAppearanceEntry);
            }
        }