コード例 #1
0
 internal AutoAssign(XmlData dat) : base("autoId")
 {
     this.dat     = dat;
     nextSignedId = GetValue <ushort>("nextSigned", "24576"); //0x6000
     nextFullId   = GetValue <ushort>("nextFull", "32768");   //0x8000
 }
コード例 #2
0
        public CreateStatus CreateCharacter(
            XmlData dat, DbAccount acc, ushort type, ushort skinType, out DbChar character)
        {
            XElement cls = dat.ObjectTypeToElement[type];

            if (_db.SetLength("alive." + acc.AccountId) >= acc.MaxCharSlot)
            {
                character = null;
                return(CreateStatus.ReachCharLimit);
            }

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

            var objDesc     = dat.ObjectDescs[type];
            var playerDesc  = dat.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)x != type))
            {
                // check to see if account meets unlock requirements
                if ((unlockClass != null && classStats[(ushort)unlockClass].BestLevel < playerDesc.Unlock.Level) ||
                    objDesc.Restricted)
                {
                    character = null;
                    return(CreateStatus.Locked);
                }
            }

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

            var newCharacters = _resources.Settings.Characters;

            character = new DbChar(acc, newId)
            {
                ObjectType = type,
                Level      = newCharacters.Level,
                StatPoint  = newCharacters.StatPoint,
                Experience = 0,
                Fame       = 0,
                Items      = InitInventory(playerDesc.Equipment),
                RuneStone  = 0x00,
                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,
                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);
        }
コード例 #3
0
        public void Wipe(XmlData dat)
        {
            var numAccounts = int.Parse(_db.StringGet("nextAccId"));

            for (var i = 1; i <= numAccounts; i++)
            {
                var acc = new DbAccount(_db, i);
                WipeAccount(acc, dat, "Langoliers");
            }

            // clear characters and death
            foreach (var key in _server.Keys(pattern: "char.*", database: DatabaseIndex))
            {
                _db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
            }
            foreach (var key in _server.Keys(pattern: "death.*", database: DatabaseIndex))
            {
                _db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
            }
            foreach (var key in _server.Keys(pattern: "alive.*", database: DatabaseIndex))
            {
                _db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
            }
            foreach (var key in _server.Keys(pattern: "dead.*", database: DatabaseIndex))
            {
                _db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
            }
            foreach (var key in _server.Keys(pattern: "account.*", database: DatabaseIndex))
            {
                _db.HashDeleteAsync(key, "firstDeath", CommandFlags.FireAndForget);
                _db.HashDeleteAsync(key, "nextCharId", CommandFlags.FireAndForget);
                _db.HashDeleteAsync(key, "ignoreList", CommandFlags.FireAndForget);
            }

            // clear legends
            _db.KeyDeleteAsync("legends", CommandFlags.FireAndForget);

            // clear banned
            _db.KeyDeleteAsync("ips", CommandFlags.FireAndForget);

            // clear pets
            foreach (var key in _server.Keys(pattern: "pet.*", database: DatabaseIndex))
            {
                _db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
            }
            _db.KeyDeleteAsync("nextPetId", CommandFlags.FireAndForget);

            // clear market
            _db.KeyDeleteAsync("market", CommandFlags.FireAndForget);
            _db.KeyDeleteAsync("marketNextId", CommandFlags.FireAndForget);

            // clear tinker
            _db.KeyDeleteAsync("tinkerQuests", CommandFlags.FireAndForget);

            // clear collectedTaxes
            _db.KeyDeleteAsync("collectedTaxes", CommandFlags.FireAndForget);

            // clear package purchases
            foreach (var key in _server.Keys(pattern: "package.*", database: DatabaseIndex))
            {
                _db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
            }

            // clear muted
            foreach (var key in _server.Keys(pattern: "mutes:*", database: DatabaseIndex))
            {
                _db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
            }
        }
コード例 #4
0
        /// <summary>
        /// This method allows you register an account, and returns any errors that might be found.
        /// </summary>
        /// <param name="guid">GUID of the new account.</param>
        /// <param name="password">Password of the new account.</param>
        public RegisterResult Register(XmlData data, string guid, string password)
        {
            if (string.IsNullOrWhiteSpace(password) || password.Length < 10)
            {
                return(RegisterResult.TOO_SHORT);
            }

            if (password.Distinct().Count() <= 3)
            {
                return(RegisterResult.REPETITIVE);
            }

            if (!Regex.Match(password, "^(?=.*[a-zA-Z])(?=.*[0-9])").Success)
            {
                return(RegisterResult.ALPHA_NUMERIC);
            }

            if (string.IsNullOrWhiteSpace(guid) || !guid.Contains("@")) //No need for a more intense check.
            {
                return(RegisterResult.INVALID_EMAIL);
            }

            if (GetLogin(guid) != null)
            {
                return(RegisterResult.EMAIL_IN_USE);
            }

            var salt = Path.GetRandomFileName();
            var hash = GetHash(salt + password);

            var id = 0;

            do
            {
                id = m_rand.Value.Next(int.MaxValue);
            } while (GetAccount(id) != null);

            var logins   = m_db.GetCollection <DbLogin>("logins");
            var accounts = m_db.GetCollection <DbAccount>("accounts");

            var login = new DbLogin
            {
                AccountId = id,
                GUID      = guid.ToUpper(),
                Salt      = salt,
                Hash      = hash
            };

            var acc = new DbAccount
            {
                Id                    = login.AccountId,
                Name                  = m_names[m_rand.Value.Next(m_names.Length)],
                NameChosen            = false,
                BeginnerPackageStatus = true,
                Credits               = 0,
                FortuneTokens         = 0,
                Fame                  = 0,
                BestCharFame          = 0,
                TotalFame             = 0,
                IsAgeVerified         = false,
                MaxNumChars           = 1,
                NextCharId            = 0,
                NextPetId             = 0,
                OwnedSkins            = new List <int>(),
                Lock                  = DateTime.UtcNow,
                Admin                 = false,
                SecurityAnswers       = new string[3],
                VerifiedEmail         = false,
                HasSecurityQuestions  = true,
                ShowSecurityQuestions = true,
                PetYardType           = 1,
                NextCharSlotPrice     = 600
            };

            foreach (var i in data.TypeToPlayer.Values)
            {
                acc.ClassStats.Add(new DbClassStat
                {
                    BestLevel  = 0,
                    BestFame   = 0,
                    ObjectType = i.ObjectType
                });
            }

            AddVault(acc, false);

            accounts.InsertOne(acc);
            logins.InsertOne(login);
            return(RegisterResult.SUCCESS);
        }