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()); }
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); }