Beispiel #1
0
        void OnTimerElapsed()
        {
            Aggregate maxvomit = Aggregate.Max(Constant.Create(0), EntityField.Create <Player>(p => p.Vomit - 5));

            context.Database.Update <Player>().Set(u => u.Experience == u.Experience + 1.0f, u => u.Vomit == maxvomit.Int).Where(u => u.IsActive == true).Execute();

            foreach (PlayerAscension player in context.Database.LoadEntities <PlayerAscension>().Where(a => a.Experience >= a.NextLevel).Execute())
            {
                LevelUp(player.UserID, player.Level + 1);
            }
        }
Beispiel #2
0
        /// <summary>
        /// updates the health of a player using a delta value
        /// </summary>
        /// <param name="playerid">id of player</param>
        /// <param name="deltahealth">value of changed health</param>
        public void UpdateHealth(long playerid, int deltahealth)
        {
            Aggregate max = Aggregate.Max(Constant.Create(0), EntityField.Create <Player>(pl => pl.CurrentHP + deltahealth));

            if (context.Database.Update <Player>().Set(p => p.CurrentHP == max.Int).Where(p => p.UserID == playerid).Execute() == 0)
            {
                return;
            }

            System.Data.DataTable table = context.Database.Load <Player>(p => p.CurrentHP, p => p.MaximumHP).Where(p => p.UserID == playerid).Execute();
            HealthChanged?.Invoke(playerid, Converter.Convert <int>(table.Rows[0][0]), Converter.Convert <int>(table.Rows[0][1]), deltahealth);
        }
Beispiel #3
0
 /// <summary>
 /// get event score for a user leading in score of a event type
 /// </summary>
 /// <param name="type">type of event to evaluate</param>
 /// <returns>event score of last month or null if no data matches</returns>
 public EventScore GetLeader(params StreamEventType[] types)
 {
     return(context.Database.Load <StreamEvent>(e => e.UserID, e => Aggregate.Sum <EntityField>(EntityField.Create <StreamEvent>(s => s.Value * s.Multiplicator)))
            .Where(e => types.Contains(e.Type))
            .GroupBy(EntityField.Create <StreamEvent>(f => f.UserID))
            .OrderBy(new OrderByCriteria(Aggregate.Sum <EntityField>(EntityField.Create <StreamEvent>(s => s.Value * s.Multiplicator)), false))
            .Limit(1)
            .ExecuteType <EventScore>((r, t) => {
         t.UserID = Converter.Convert <long>(r[0]);
         t.Score = Converter.Convert <double>(r[1]);
     }).FirstOrDefault());
 }
        public EquipmentBonus GetEquipmentBonus(long playerid, EquipmentSlot slot)
        {
            Aggregate damagesum = Aggregate.Sum <EquippedItemInformation>(EntityField.Create <EquippedItemInformation>(e => e.Damage));
            Aggregate armorsum  = Aggregate.Sum <EquippedItemInformation>(EntityField.Create <EquippedItemInformation>(e => e.Armor));

            DataTable valuetable = context.Database.Load <EquippedItemInformation>(i => damagesum, i => armorsum).Where(i => i.PlayerID == playerid && i.Slot == slot).Execute();

            return(new EquipmentBonus
            {
                Damage = Converter.Convert <int>(valuetable.Rows[0][0], true),
                Armor = Converter.Convert <int>(valuetable.Rows[0][1], true),
            });
        }
        public EquipmentBonus GetEquipmentBonus(long playerid)
        {
            Aggregate damagesum    = Aggregate.Sum <EquippedItemInformation>(EntityField.Create <EquippedItemInformation>(e => e.Damage));
            Aggregate armorsum     = Aggregate.Sum <EquippedItemInformation>(EntityField.Create <EquippedItemInformation>(e => e.Armor));
            Aggregate usageoptimum = Aggregate.Average(EntityField.Create <EquippedItemInformation>(e => e.UsageOptimum));
            DataTable table        = context.Database.Load <EquippedItemInformation>(i => damagesum, i => armorsum).Where(i => i.PlayerID == playerid).Execute();

            return(new EquipmentBonus {
                Damage = Converter.Convert <int>(table.Rows[0][0], true),
                Armor = Converter.Convert <int>(table.Rows[0][1], true),
                WeaponCritical = context.Database.Load <EquippedItemInformation>(i => usageoptimum).Where(i => i.PlayerID == playerid && i.Type == ItemType.Armor).ExecuteScalar <int>(),
                ArmorCritical = context.Database.Load <EquippedItemInformation>(i => usageoptimum).Where(i => i.PlayerID == playerid && i.Type == ItemType.Weapon).ExecuteScalar <int>()
            });
        }
Beispiel #6
0
 /// <summary>
 /// get the last events which occured in this stream
 /// </summary>
 /// <param name="count">number of events to return</param>
 /// <returns>stream events</returns>
 public IEnumerable <StreamEvent> GetLastEvents(int count, params StreamEventType[] types)
 {
     if (types.Length == 0)
     {
         return(context.Database.LoadEntities <StreamEvent>()
                .Where(e => e.Type != StreamEventType.Chat)
                .OrderBy(new OrderByCriteria(EntityField.Create <StreamEvent>(e => e.Timestamp), false))
                .Limit(count)
                .Execute());
     }
     return(context.Database.LoadEntities <StreamEvent>()
            .Where(e => types.Contains(e.Type))
            .OrderBy(new OrderByCriteria(EntityField.Create <StreamEvent>(e => e.Timestamp), false))
            .Limit(count)
            .Execute());
 }
Beispiel #7
0
        /// <summary>
        /// get event score for a user leading in score of a event type of the last month
        /// </summary>
        /// <param name="type">type of event to evaluate</param>
        /// <returns>event score of last month or null if no data matches</returns>
        public EventScore GetLastMonthLeader(params StreamEventType[] types)
        {
            DateTime now       = DateTime.Now;
            DateTime thismonth = new DateTime(now.Year, now.Month, 1);

            now = now.AddMonths(-1);
            DateTime lastmonth = new DateTime(now.Year, now.Month, 1);

            return(context.Database.Load <StreamEvent>(e => e.UserID, e => Aggregate.Sum <EntityField>(EntityField.Create <StreamEvent>(s => s.Value * s.Multiplicator)))
                   .Where(e => types.Contains(e.Type) && e.Timestamp >= lastmonth && e.Timestamp < thismonth)
                   .GroupBy(EntityField.Create <StreamEvent>(f => f.UserID))
                   .OrderBy(new OrderByCriteria(Aggregate.Sum <EntityField>(EntityField.Create <StreamEvent>(s => s.Value * s.Multiplicator)), false))
                   .Limit(1)
                   .ExecuteType <EventScore>((r, t) => {
                t.UserID = Converter.Convert <long>(r[0]);
                t.Score = Converter.Convert <double>(r[1]);
            }).FirstOrDefault());
        }
Beispiel #8
0
        void BuyFromTravelingMerchant(string service, string channel, string username, Player player, Item item, int quantity, double discount)
        {
            User user = context.GetModule <UserModule>().GetExistingUser(service, username);

            int price = (int)(item.Value * (travelingmerchant.Price - discount));

            if (price > player.Gold)
            {
                context.GetModule <StreamModule>().SendMessage(service, channel, username, $"Sadly you don't have enough gold. You would need {price} gold to buy {item.GetCountName(quantity)}");
                return;
            }

            AddInventoryItemResult result = context.GetModule <InventoryModule>().AddItem(player.UserID, item.ID, quantity);

            switch (result)
            {
            case AddInventoryItemResult.Success:
            case AddInventoryItemResult.SuccessFull:
                Aggregate agg = Aggregate.Max(Constant.Create(0), EntityField.Create <Player>(pl => pl.Gold));
                context.Database.Update <Player>().Set(p => p.Gold == agg.Int - price).Where(p => p.UserID == player.UserID).Execute();


                RPGMessageBuilder message = context.GetModule <RPGMessageModule>().Create().User(user).Text(" bought ").Item(item, quantity).Text(" and spent ").Gold(price);

                if (result == AddInventoryItemResult.SuccessFull)
                {
                    message.Text(" and is now encumbered.");
                }
                else
                {
                    message.Text(".");
                }

                message.Send();
                break;

            case AddInventoryItemResult.InventoryFull:
                context.GetModule <StreamModule>().SendMessage(service, channel, username, $"You don't have room in your inventory to buy {quantity} {item.Name}");
                break;
            }
        }
Beispiel #9
0
        public int GetUsedSkillPoints(long playerid)
        {
            Aggregate aggregate = Aggregate.Sum <int>(EntityField.Create <SkillConsumption>(s => s.Consumption));

            return(context.Database.Load <SkillConsumption>(aggregate).Where(s => s.PlayerID == playerid).ExecuteScalar <int>());
        }
Beispiel #10
0
 public ActivePoll GetMostActivePoll()
 {
     return(context.Database.LoadEntities <ActivePoll>().OrderBy(new OrderByCriteria(EntityField.Create <ActivePoll>(p => p.Votes), false)).Limit(1).Execute().FirstOrDefault());
 }
Beispiel #11
0
        public long GetBiggestDonor()
        {
            DateTime lastmonth = DateTime.Now - TimeSpan.FromDays(30);

            return(context.Database.Load <StreamEvent>(e => e.UserID).Where(e => (e.Type == StreamEventType.Subscription || e.Type == StreamEventType.Donation) && e.Timestamp > lastmonth).GroupBy(EntityField.Create <StreamEvent>(f => f.UserID)).OrderBy(new OrderByCriteria(Aggregate.Sum <EntityField>(EntityField.Create <StreamEvent>(s => s.Value * s.Multiplicator)), false)).Limit(1).ExecuteScalar <long>());
        }
Beispiel #12
0
        public void Buy(string service, string channel, string username, string[] arguments)
        {
            int argumentindex = 0;
            int quantity      = arguments.RecognizeQuantity(ref argumentindex);

            if (arguments.Length <= argumentindex)
            {
                context.GetModule <StreamModule>().SendMessage(service, channel, username, "You have to specify the name of the item to buy.");
                return;
            }

            Item item = context.GetModule <ItemModule>().RecognizeItem(arguments, ref argumentindex);

            if (item == null)
            {
                context.GetModule <StreamModule>().SendMessage(service, channel, username, "I don't understand what exactly you want to buy.");
                return;
            }

            if (quantity == -1)
            {
                quantity = 1;
            }

            if (quantity <= 0)
            {
                context.GetModule <StreamModule>().SendMessage(service, channel, username, $"It wouldn't make sense to buy {item.GetCountName(quantity)}.");
                return;
            }

            bool insulted = messageevaluator.HasInsult(arguments, argumentindex);

            User   user   = context.GetModule <UserModule>().GetExistingUser(service, username);
            Player player = context.GetModule <PlayerModule>().GetPlayer(service, username);

            double discount = GetDiscount(context.GetModule <SkillModule>().GetSkillLevel(player.UserID, SkillType.Haggler));

            if (insulted)
            {
                discount -= 0.2;
            }

            int price;

            if (item.Type == ItemType.Special)
            {
                price = GetSpecialPriceToBuy(item.Value, discount);
            }
            else
            {
                ShopItem shopitem = context.Database.LoadEntities <ShopItem>().Where(i => i.ItemID == item.ID).Execute().FirstOrDefault();
                if (shopitem == null || shopitem.Quantity < quantity)
                {
                    if (travelingmerchant != null && travelingmerchant.Type == item.Type)
                    {
                        if (item.LevelRequirement > player.Level && !insulted)
                        {
                            context.GetModule <StreamModule>().SendMessage(service, channel, username, $"The merchant denies you access to the item as you wouldn't be able to use it. (Level {item.LevelRequirement})");
                            return;
                        }

                        BuyFromTravelingMerchant(service, channel, username, player, item, quantity, discount);
                        return;
                    }

                    if (shopitem == null || shopitem.Quantity == 0)
                    {
                        context.GetModule <StreamModule>().SendMessage(service, channel, username, "The shopkeeper tells you that he has nothing on stock.");
                    }
                    else
                    {
                        context.GetModule <StreamModule>().SendMessage(service, channel, username, $"The shopkeeper tells you that he only has {item.GetCountName(shopitem.Quantity)}.");
                    }
                    return;
                }

                if (!insulted)
                {
                    if (Mood < 0.5)
                    {
                        context.GetModule <StreamModule>().SendMessage(service, channel, username, "The shopkeeper does not see a point in doing anything anymore.");
                        return;
                    }

                    if (context.Database.Load <ShopQuirk>(DBFunction.Count).Where(q => q.Type == ShopQuirkType.Phobia && q.ID == item.ID).ExecuteScalar <int>() > 0)
                    {
                        context.GetModule <RPGMessageModule>().Create().ShopKeeper().Text(" tells ").User(user).Text(" that no one should mess with ").ItemMultiple(item).Text(" since it is devil's work.").Send();
                        return;
                    }

                    if (context.Database.Load <ShopQuirk>(DBFunction.Count).Where(q => q.Type == ShopQuirkType.Nerd && q.ID == item.ID).ExecuteScalar <int>() > 0)
                    {
                        context.GetModule <RPGMessageModule>().Create().ShopKeeper().Text(" does not want to share his beloved ").ItemMultiple(item).Text(".").Send();
                        return;
                    }

                    if (context.Database.Load <ShopQuirk>(DBFunction.Count).Where(q => q.Type == ShopQuirkType.Grudge && q.ID == player.UserID).ExecuteScalar <int>() > 0)
                    {
                        context.GetModule <RPGMessageModule>().Create().ShopKeeper().Text(" casually ignores ").User(user).Text(".").Send();
                        return;
                    }
                }

                if (item.LevelRequirement > player.Level && !insulted)
                {
                    context.GetModule <StreamModule>().SendMessage(service, channel, username, $"The shopkeeper denies you access to the item as you wouldn't be able to use it. (Level {item.LevelRequirement})");
                    return;
                }

                price = (int)(item.Value * quantity * (1.0 + GetQuantityFactor(shopitem.Quantity) * 2 - discount) * shopitem.Discount);
            }

            if (price > player.Gold)
            {
                context.GetModule <StreamModule>().SendMessage(service, channel, username, $"Sadly you don't have enough gold. You would need {price} gold to buy {item.GetCountName(quantity)}");
                return;
            }

            AddInventoryItemResult result = context.GetModule <InventoryModule>().AddItem(player.UserID, item.ID, quantity);

            switch (result)
            {
            case AddInventoryItemResult.Success:
            case AddInventoryItemResult.SuccessFull:
                Aggregate agg = Aggregate.Max(Constant.Create(0), EntityField.Create <Player>(pl => pl.Gold));
                context.Database.Update <Player>().Set(p => p.Gold == agg.Int - price).Where(p => p.UserID == player.UserID).Execute();

                if (item.Type != ItemType.Special)
                {
                    context.Database.Update <ShopItem>().Set(i => i.Quantity == i.Quantity - quantity).Where(i => i.ItemID == item.ID).Execute();
                }

                RPGMessageBuilder message = context.GetModule <RPGMessageModule>().Create();
                message.User(user).Text(" has bought ").Item(item, quantity).Text(" from ").ShopKeeper().Text(" for ").Gold(price).Text(".");

                if (result == AddInventoryItemResult.SuccessFull)
                {
                    message.User(user).Text(" is now encumbered.");
                }

                message.Send();
                Mood += 0.05 * (1.0 - discount);
                break;

            case AddInventoryItemResult.InventoryFull:
                context.GetModule <RPGMessageModule>().Create().User(user).Text(" carries to much to buy ").Item(item, quantity).Text(".").Send();
                break;
            }
        }