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); }
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); }
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); }
private void RequestCreateCharacterInSlot(RequestCreateCharacterInSlotPacket packet) { CharacterManager.Instance.RequestCreateCharacterInSlot(Client, packet); }
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); } }