Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
            }
        }