Пример #1
0
        public Task <bool> SaveCharacter(
            DbAccount acc, DbChar character, DbClassStats stats, bool lockAcc)
        {
            var trans = _db.CreateTransaction();

            if (lockAcc)
            {
                trans.AddCondition(Condition.StringEqual(
                                       $"lock:{acc.AccountId}", acc.LockToken));
            }
            character.FlushAsync(trans);
            stats.Update(character);
            stats.FlushAsync(trans);
            return(trans.ExecuteAsync());
        }
Пример #2
0
        public CreateStatus CreateCharacter(DbAccount acc, ushort type, ushort skinType, out DbChar character)
        {
            if (_db.SetLength("alive." + acc.AccountId) >= acc.MaxCharSlot)
            {
                character = null;
                return(CreateStatus.ReachCharLimit);
            }

            // check skin requirements
            if (skinType != 0)
            {
                var skinDesc = _resources.GameData.Skins[skinType];
                if (!acc.Skins.Contains(skinType) ||
                    skinDesc.PlayerClassType != type)
                {
                    character = null;
                    return(CreateStatus.SkinUnavailable);
                }
            }

            var objDesc     = _resources.GameData.ObjectDescs[type];
            var playerDesc  = _resources.GameData.Classes[type];
            var classStats  = ReadClassStats(acc);
            var unlockClass = (playerDesc.Unlock != null)
                ? playerDesc.Unlock.Type
                : null;

            // check to see if account has unlocked via gold
            if (classStats.AllKeys
                .All(x => (ushort)(int)x != type))
            {
                // check to see if account meets unlock requirements
                if ((unlockClass != null && classStats[(ushort)unlockClass].BestLevel < playerDesc.Unlock.Level))
                {
                    character = null;
                    return(CreateStatus.Locked);
                }
            }

            var newId = (int)_db.HashIncrement(acc.Key, "nextCharId");

            var newCharacters = _resources.Settings.NewCharacters;

            character = new DbChar(acc, newId)
            {
                ObjectType = type,
                Level      = newCharacters.Level,
                Experience = 0,
                Fame       = 0,
                Items      = InitInventory(playerDesc.Equipment),
                Stats      = new int[]
                {
                    playerDesc.Stats[0].StartingValue,
                    playerDesc.Stats[1].StartingValue,
                    playerDesc.Stats[2].StartingValue,
                    playerDesc.Stats[3].StartingValue,
                    playerDesc.Stats[4].StartingValue,
                    playerDesc.Stats[5].StartingValue,
                    playerDesc.Stats[6].StartingValue,
                    playerDesc.Stats[7].StartingValue,
                },
                HP         = playerDesc.Stats[0].StartingValue,
                MP         = playerDesc.Stats[1].StartingValue,
                Tex1       = 0,
                Tex2       = 0,
                Skin       = skinType,
                PetId      = 0,
                FameStats  = new byte[0],
                CreateTime = DateTime.Now,
                LastSeen   = DateTime.Now
            };

            if (newCharacters.Maxed)
            {
                character.Stats = new int[]
                {
                    playerDesc.Stats[0].MaxValue,
                    playerDesc.Stats[1].MaxValue,
                    playerDesc.Stats[2].MaxValue,
                    playerDesc.Stats[3].MaxValue,
                    playerDesc.Stats[4].MaxValue,
                    playerDesc.Stats[5].MaxValue,
                    playerDesc.Stats[6].MaxValue,
                    playerDesc.Stats[7].MaxValue,
                };
                character.HP = character.Stats[0];
                character.MP = character.Stats[1];
            }

            character.FlushAsync();
            _db.SetAdd("alive." + acc.AccountId, BitConverter.GetBytes(newId));
            return(CreateStatus.OK);
        }