internal AutoAssign(XmlData dat) : base("autoId") { this.dat = dat; nextSignedId = GetValue <ushort>("nextSigned", "24576"); //0x6000 nextFullId = GetValue <ushort>("nextFull", "32768"); //0x8000 }
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); }
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); } }
/// <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); }