Exemplo n.º 1
0
        public DbChar LoadCharacter(int accId, int charId)
        {
            DbAccount acc = new DbAccount(_db, accId);

            if (acc.IsNull)
            {
                return(null);
            }
            DbChar ret = new DbChar(acc, charId);

            if (ret.IsNull)
            {
                return(null);
            }
            else
            {
                return(ret);
            }
        }
Exemplo n.º 2
0
        public CreateStatus CreateCharacter(
            XmlData dat, DbAccount acc, ushort type, out DbChar character)
        {
            XElement cls = dat.ObjectTypeToElement[type];

            if (Sets.GetLength(0, "alive." + acc.AccountId).Exec() >= acc.MaxCharSlot)
            {
                character = null;
                return(CreateStatus.ReachCharLimit);
            }

            int newId = (int)Hashes.Increment(0, acc.Key, "nextCharId").Exec();

            character = new DbChar(acc, newId)
            {
                ObjectType = type,
                Level      = 1,
                Experience = 0,
                Fame       = 0,
                Items      = cls.Element("Equipment").Value.CommaToArray <ushort>(),
                Stats      = new int[] {
                    ushort.Parse(cls.Element("MaxHitPoints").Value),
                    ushort.Parse(cls.Element("MaxMagicPoints").Value),
                    ushort.Parse(cls.Element("Attack").Value),
                    ushort.Parse(cls.Element("Defense").Value),
                    ushort.Parse(cls.Element("Speed").Value),
                    ushort.Parse(cls.Element("Dexterity").Value),
                    ushort.Parse(cls.Element("HpRegen").Value),
                    ushort.Parse(cls.Element("MpRegen").Value),
                },
                HP         = int.Parse(cls.Element("MaxHitPoints").Value),
                MP         = int.Parse(cls.Element("MaxMagicPoints").Value),
                Tex1       = 0,
                Tex2       = 0,
                Pet        = 0xffff,
                FameStats  = new byte[0],
                CreateTime = DateTime.Now,
                LastSeen   = DateTime.Now
            };
            character.Flush();
            Sets.Add(0, "alive." + acc.AccountId, BitConverter.GetBytes(newId));
            return(CreateStatus.OK);
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
 public bool IsAlive(DbChar character)
 {
     return(_db.SetContains("alive." + character.Account.AccountId,
                            BitConverter.GetBytes(character.CharId)));
 }
Exemplo n.º 5
0
        public IEnumerable <Tuple <string, string, double> > GetBonuses(EmbeddedData data, DbChar character, bool firstBorn)
        {
            foreach (var i in bonusDat)
            {
                if (i.Item3(this, character, character.Fame))
                {
                    yield return(Tuple.Create(i.Item1, i.Item2, i.Item4(character.Fame)));
                }
            }

            //Well Equiped
            var bonus = character.Items.Take(4).Where(x => x != -1).Sum(x => data.Items[(ushort)x].FameBonus) / 100.0;

            if (bonus > 0)
            {
                yield return(Tuple.Create("Well Equipped", "Bonus for equipment", character.Fame * bonus));
            }

            //First born
            if (firstBorn)
            {
                yield return(Tuple.Create("First Born", "Best fame of any of your previous incarnations", character.Fame * 0.1));
            }
        }
Exemplo n.º 6
0
 public bool IsAlive(DbChar character) => Sets.Contains(0, $"alive.{character.Account.AccountId}", BitConverter.GetBytes(character.CharId)).Exec();
Exemplo n.º 7
0
 public bool IsAlive(DbChar character)
 {
     return(Sets.Contains(0, "alive." + character.Account.AccountId,
                          BitConverter.GetBytes(character.CharId)).Exec());
 }