protected virtual GameOperationResponse HandleOperationCreateCharacter(GameOperationRequest operationRequest, MessageParameters parameters) { var operation = new CreateCharacter(this.peer.Protocol, operationRequest); if (!operation.IsValid) { return(operation.GetErrorResponse((short)ResultCode.InvalidOperationParameter, operation.GetErrorMessage())); } ThreadPool.QueueUserWorkItem( o => this.ExecUserOperation(() => this.HandleCreateCharacter(operationRequest.ClientId, operation), operationRequest.ClientId, parameters)); return(null); }
private GameOperationResponse HandleCreateCharacter(int sessionId, CreateCharacter operation) { try { var charInfo = operation.CharacterData; var characterName = charInfo.Name; var existingPlayer = this.application.CharacterDatabase.Query <PlayerData>("PlayerData/ByName") //.Customize(x => x.WaitForNonStaleResultsAsOfNow()) .Select(player => new { player.Name }) .FirstOrDefault(player => player.Name.Equals(characterName, StringComparison.CurrentCultureIgnoreCase)); if (existingPlayer != null) { return(operation.GetErrorResponse((short)ResultCode.CharacterNameAlreadyExists)); } ResultCode resultCode; if (CharacterHelper.IsValidCharacterName(characterName, out resultCode) == false) { return(operation.GetErrorResponse((short)resultCode)); } if (CharacterHelper.IsValidCharacterInfo(charInfo, out resultCode) == false) { return(operation.GetErrorResponse((short)resultCode)); } var guid = Utils.NewGuidInt32(GuidCreationCulture.Utc); var charStats = CharacterSettings.NewCharacterDefaultStats; var actionItemsCount = Mathf.Min(CharacterSettings.NewCharacterDefaultSpells.Length, GlobalGameSettings.PLAYER_ACTION_BAR_SIZE); var actionItems = new int[actionItemsCount]; for (var i = 0; i < actionItemsCount; i++) { actionItems[i] = (int)new ActionItemStructure(CharacterSettings.NewCharacterDefaultSpells[i], (byte)ActionItemType.Spell, (byte)i); } var inventoryItemsCount = Mathf.Min(CharacterSettings.NewCharacterDefaultItems.Length, GlobalGameSettings.PLAYER_DEFAULT_INVENTORY_SIZE); var inventoryItems = new int[inventoryItemsCount]; for (byte i = 0; i < inventoryItemsCount; i++) { var inventoryItem = CharacterSettings.NewCharacterDefaultItems[i]; inventoryItems[i] = (int)new ContainerItemStructure(inventoryItem.ItemId, i, inventoryItem.Count); } var spellsInfo = SpellManager.CreateNew().ToDataField(); spellsInfo.ClientSpells = CharacterSettings.NewCharacterDefaultSpells; var newPlayerData = new PlayerData { Id = PlayerData.GenerateId(guid), Guid = guid, Username = operation.Username, GmLevel = 0, Name = characterName, Race = charInfo.Race, Origin = charInfo.Origin, Species = (byte)Species.Humanoid, Level = CharacterSettings.NEW_CHARACTER_DEFAULT_LEVEL, Orientation = CharacterSettings.NewCharacterDefaultOrientation, Position = CharacterSettings.NewCharacterDefaultPosition.ToFloatArray(3), ZoneId = CharacterSettings.NEW_CHARACTER_DEFAULT_ZONE_ID, Inventory = new InventoryData { Size = GlobalGameSettings.PLAYER_DEFAULT_INVENTORY_SIZE, Items = inventoryItems }, Stats = charStats, Spells = spellsInfo, ActionBar = new ActionBarData { Items = actionItems }, CurrentQuests = new Dictionary <short, QuestProgression>(0), FinishedQuests = new short[0], CurrHealth = charStats[Stats.Health - Stats.eFirstStat], CurrMana = charStats[Stats.Power - Stats.eFirstStat], InitLogin = true, CreatedOn = DateTime.Now, LastPlayed = null }; this.application.CharacterDatabase.Store(newPlayerData); var socialProfileData = new SocialProfileData { Id = SocialProfileData.GenerateId(newPlayerData.Guid), Guid = newPlayerData.Guid, GmLevel = newPlayerData.GmLevel, Name = newPlayerData.Name, Level = newPlayerData.Level, Friends = new string[0], Ignores = new string[0] }; this.application.CharacterDatabase.Store(socialProfileData); return(new CreateCharacterResponse(operation.OperationCode) { ReturnCode = (short)ResultCode.Ok, CharacterData = charInfo }); } catch (Exception e) { _logger.Error(e); return(operation.GetErrorResponse((short)ResultCode.Fail)); } }