示例#1
0
        public Task UpdateGuildFame(DbGuild guild, int amount, ITransaction transaction = null)
        {
            var guildKey = $"guild.{guild.Id}";

            var trans = transaction ?? _db.CreateTransaction();

            if (amount > 0)
            {
                trans.HashIncrementAsync(guildKey, "totalFame", amount)
                .ContinueWith(t =>
                {
                    if (!t.IsCanceled)
                    {
                        guild.TotalFame = (int)t.Result;
                    }
                });
            }

            var task = trans.HashIncrementAsync(guildKey, "fame", amount)
                       .ContinueWith(t =>
            {
                if (!t.IsCanceled)
                {
                    guild.Fame = (int)t.Result;
                }
            });

            if (transaction == null)
            {
                trans.Execute();
            }

            return(task);
        }
示例#2
0
        public GuildCreateStatus CreateGuild(string guildName, out DbGuild guild)
        {
            guild = null;

            if (String.IsNullOrWhiteSpace(guildName))
            {
                return(GuildCreateStatus.InvalidName);
            }

            guildName = guildName.Trim();

            int newGuildId = (int)Strings.Increment(0, "newGuildId").Exec();

            if (!Hashes.SetIfNotExists(0, "guilds", guildName.ToUpperInvariant(), Convert.ToString(newGuildId)).Exec())
            {
                return(GuildCreateStatus.UsedName);
            }

            guild = new DbGuild(this, newGuildId)
            {
                Name      = guildName,
                Level     = 0,
                Fame      = 0,
                TotalFame = 0
            };

            guild.Flush();

            return(GuildCreateStatus.OK);
        }
示例#3
0
        public DbGuild GetGuild(int id)
        {
            var ret = new DbGuild(_db, id);

            if (ret.IsNull)
            {
                return(null);
            }
            return(ret);
        }
示例#4
0
        public bool SetGuildBoard(DbGuild guild, string text)
        {
            if (guild.IsNull)
            {
                return(false);
            }

            guild.Board = text;
            guild.FlushAsync();
            return(true);
        }
示例#5
0
        public bool ChangeGuildLevel(DbGuild guild, int level)
        {
            if (level != 1 &&
                level != 2 &&
                level != 3)
            {
                return(false);
            }

            guild.Level = level;
            guild.Flush();
            return(true);
        }
示例#6
0
        public bool ChangeGuildLevel(DbGuild guild, int level)
        {
            // supported guild levels
            if (level != 1 &&
                level != 2 &&
                level != 3)
            {
                return(false);
            }

            guild.Level = level;
            guild.FlushAsync();
            return(true);
        }
示例#7
0
        public AddGuildMemberStatus AddGuildMember(DbGuild guild, DbAccount acc, bool founder = false)
        {
            if (acc == null)
            {
                return(AddGuildMemberStatus.Error);
            }

            if (acc.NameChosen == false)
            {
                return(AddGuildMemberStatus.NameNotChosen);
            }

            if (acc.GuildId == guild.Id)
            {
                return(AddGuildMemberStatus.AlreadyInGuild);
            }

            if (acc.GuildId > 0)
            {
                return(AddGuildMemberStatus.InAnotherGuild);
            }

            using (TimedLock.Lock(guild.MemberLock))
            {
                int guildSize = 50;
                // probably not best to lock this up but should be ok
                if (guild.Members.Length >= guildSize)
                {
                    return(AddGuildMemberStatus.GuildFull);
                }

                var members = guild.Members.ToList();
                if (members.Contains(acc.AccountId))
                {
                    return(AddGuildMemberStatus.IsAMember); // this should not happen...
                }
                members.Add(acc.AccountId);
                guild.Members = members.ToArray();
                guild.FlushAsync();
            }

            // set account guild info
            acc.GuildId   = guild.Id;
            acc.GuildRank = (founder) ? 40 : 0;
            acc.FlushAsync();

            return(AddGuildMemberStatus.OK);
        }
示例#8
0
        public void Death(XmlData dat, DbAccount acc, DbChar character, FameStats stats, string killer)
        {
            character.Dead = true;
            var classStats = new DbClassStats(acc);

            // calculate total fame given bonuses
            bool firstBorn;
            var  finalFame = stats.CalculateTotal(dat, character,
                                                  classStats, out firstBorn);

            // save character
            character.FinalFame = finalFame;
            SaveCharacter(acc, character, classStats, acc.LockToken != null);

            var death = new DbDeath(acc, character.CharId)
            {
                ObjectType = character.ObjectType,
                Level      = character.Level,
                TotalFame  = finalFame,
                Killer     = killer,
                FirstBorn  = firstBorn,
                DeathTime  = DateTime.UtcNow
            };

            death.FlushAsync();

            var idBuff = BitConverter.GetBytes(character.CharId);

            _db.SetRemoveAsync(
                "alive." + acc.AccountId, idBuff, CommandFlags.FireAndForget);
            _db.ListLeftPushAsync(
                "dead." + acc.AccountId, idBuff, When.Always, CommandFlags.FireAndForget);

            UpdateFame(acc, finalFame);

            var guild = new DbGuild(acc);

            if (!guild.IsNull)
            {
                UpdateGuildFame(guild, finalFame);
                UpdatePlayerGuildFame(acc, finalFame);
            }

            if (!acc.Admin)
            {
                DbLegend.Insert(_db, acc.AccountId, character.CharId, finalFame);
            }
        }
示例#9
0
        public AddGuildMemberStatus AddGuildMember(DbGuild guild, DbAccount acc, bool founder = false)
        {
            if (acc == null)
            {
                return(AddGuildMemberStatus.Error);
            }

            if (acc.NameChosen == false)
            {
                return(AddGuildMemberStatus.NameNotChosen);
            }

            if (Convert.ToInt32(acc.GuildId) == guild.Id)
            {
                return(AddGuildMemberStatus.AlreadyInGuild);
            }

            if (Convert.ToInt32(acc.GuildId) > 0)
            {
                return(AddGuildMemberStatus.InAnotherGuild);
            }

            int guildSize = 100;

            if (guild.Members.Length >= guildSize)
            {
                return(AddGuildMemberStatus.GuildFull);
            }

            var members = guild.Members.ToList();

            if (members.Contains(Convert.ToInt32(acc.AccountId)))
            {
                return(AddGuildMemberStatus.IsAMember);
            }
            members.Add(Convert.ToInt32(acc.AccountId));
            guild.Members = members.ToArray();
            guild.Flush();

            acc.GuildId   = Convert.ToString(guild.Id);
            acc.GuildRank = (founder) ? 40 : 0;
            acc.Flush();

            return(AddGuildMemberStatus.OK);
        }
示例#10
0
        public GuildCreateStatus CreateGuild(string guildName, out DbGuild guild)
        {
            guild = null;

            if (String.IsNullOrWhiteSpace(guildName))
            {
                return(GuildCreateStatus.InvalidName);
            }

            // remove excessive whitespace
            var rgx = new Regex(@"\s+");

            guildName = rgx.Replace(guildName, " ");
            guildName = guildName.Trim();

            // check if valid
            rgx = new Regex(@"^[A-Za-z\s]{1,20}$");
            if (!rgx.IsMatch(guildName))
            {
                return(GuildCreateStatus.InvalidName);
            }

            // add guild to guild list
            var newGuildId = (int)_db.StringIncrement("nextGuildId");

            if (!_db.HashSet("guilds", guildName.ToUpperInvariant(), newGuildId, When.NotExists))
            {
                return(GuildCreateStatus.UsedName);
            }

            // create guild data structure
            guild = new DbGuild(_db, newGuildId)
            {
                Name      = guildName,
                Level     = 0,
                Fame      = 0,
                TotalFame = 0
            };

            // save
            guild.FlushAsync();

            return(GuildCreateStatus.OK);
        }