예제 #1
0
        public async Task BuyItemHandler(GameSession session, ItemBuyItemReqMessage message)
        {
            try
            {
                var shop = GameServer.Instance.ResourceCache.GetShop();
                var plr  = session.Player;
                foreach (var item in message.Items)
                {
                    var shopItemInfo = shop.GetItemInfo(item.ItemNumber, item.PriceType);
                    if (shopItemInfo == null)
                    {
                        Logger.ForAccount(session)
                        .Error("No shop entry found for {item}",
                               new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        await session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));

                        return;
                    }
                    if (!shopItemInfo.IsEnabled)
                    {
                        Logger.ForAccount(session)
                        .Error("Shop entry is not enabled {item}",
                               new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        await session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));

                        return;
                    }

                    var priceGroup = shopItemInfo.PriceGroup;
                    var price      = priceGroup.GetPrice(item.PeriodType, item.Period);
                    if (price == null)
                    {
                        Logger.ForAccount(session)
                        .Error("Invalid price group for shop entry {item}",
                               new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        await session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));

                        return;
                    }

                    if (!price.IsEnabled)
                    {
                        Logger.ForAccount(session)
                        .Error("Shop entry is not enabled {item}",
                               new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        await session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));

                        return;
                    }

                    if (item.Color > shopItemInfo.ShopItem.ColorGroup)
                    {
                        Logger.ForAccount(session)
                        .Error("Shop entry has no color {color} {item}",
                               item.Color, new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        await session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));

                        return;
                    }

                    var itemeffects = new List <uint>();
                    if (item.Effect != 0)
                    {
                        if (shopItemInfo.EffectGroup.MainEffect == item.Effect)
                        {
                            foreach (var effect in shopItemInfo.EffectGroup.Effects)
                            {
                                itemeffects.Add(effect.Effect);
                            }
                        }
                        else
                        {
                            Logger.ForAccount(session)
                            .Error("Shop entry has no effect {effect} {item}",
                                   item.Effect, new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                            await session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));

                            return;
                        }
                    }
                    else
                    {
                        itemeffects.Add(0);
                    }
                    //if (item.Effect != 0)
                    //{
                    //    if (shopItemInfo.EffectGroup.Effects.All(effect => effect.Effect != item.Effect))
                    //    {
                    //        Logger.ForAccount(session)
                    //            .Error("Shop entry has no effect {effect} {item}",
                    //                item.Effect, new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });
                    //
                    //        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                    //        return;
                    //    }
                    //}

                    // ToDo missing price types
                    switch (shopItemInfo.PriceGroup.PriceType)
                    {
                    case ItemPriceType.PEN:
                        if (plr.PEN < price.Price)
                        {
                            await session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.NotEnoughMoney));

                            return;
                        }
                        plr.PEN -= (uint)price.Price;
                        break;

                    case ItemPriceType.AP:
                    case ItemPriceType.Premium:
                        if (plr.AP < price.Price)
                        {
                            await session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.NotEnoughMoney));

                            return;
                        }
                        plr.AP -= (uint)price.Price;
                        break;

                    default:
                        Logger.ForAccount(session)
                        .Error("Unknown PriceType {priceType}", shopItemInfo.PriceGroup.PriceType);
                        return;
                    }

                    PlayerItem stackitem = null;
                    var        stacked   = false;
                    switch (item.PeriodType)
                    {
                    case ItemPeriodType.None:
                        break;

                    case ItemPeriodType.Units:
                        stackitem = session.Player.Inventory.GetItemByShopInfoId((uint)shopItemInfo.Id);
                        if (stackitem != null)
                        {
                            stackitem.Count      += item.Period;
                            stackitem.NeedsToSave = true;
                            stacked = true;
                        }
                        break;

                    case ItemPeriodType.Days:
                    case ItemPeriodType.Hours:
                        break;

                    default:
                        Logger.ForAccount(session)
                        .Error("Unknown PriceType {priceType}", item.PeriodType);
                        break;
                    }
                    var plrItem = stackitem;

                    if (!stacked)
                    {
                        plrItem = session.Player.Inventory.Create(shopItemInfo, price, item.Color,
                                                                  itemeffects.ToArray(),
                                                                  (uint)(price.PeriodType == ItemPeriodType.Units ? price.Period : 0));
                    }
                    else
                    {
                        await session.SendAsync(new ItemUpdateInventoryAckMessage(InventoryAction.Update,
                                                                                  plrItem.Map <PlayerItem, ItemDto>()));
                    }

                    await session.SendAsync(new ItemBuyItemAckMessage(new[] { plrItem.Id }, item));

                    await session.SendAsync(new MoneyRefreshCashInfoAckMessage(plr.PEN, plr.AP));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
예제 #2
0
        public async Task BuyItemHandler(GameSession session, ItemBuyItemReqMessage message)
        {
            var shop = GameServer.Instance.ResourceCache.GetShop();
            var plr  = session.Player;

            foreach (var item in message.Items)
            {
                var shopItemInfo = shop.GetItemInfo(item.ItemNumber, item.PriceType);
                if (shopItemInfo == null)
                {
                    Logger.ForAccount(session)
                    .Error("No shop entry found for {item}",
                           new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                    session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                    return;
                }
                if (!shopItemInfo.IsEnabled)
                {
                    Logger.ForAccount(session)
                    .Error("Shop entry is not enabled {item}",
                           new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                    session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                    return;
                }

                var priceGroup = shopItemInfo.PriceGroup;
                var price      = priceGroup.GetPrice(item.PeriodType, item.Period);
                if (price == null)
                {
                    Logger.ForAccount(session)
                    .Error("Invalid price group for shop entry {item}",
                           new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                    session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                    return;
                }

                if (!price.IsEnabled)
                {
                    Logger.ForAccount(session)
                    .Error("Shop entry is not enabled {item}",
                           new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                    session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                    return;
                }

                if (item.Color > shopItemInfo.ShopItem.ColorGroup)
                {
                    Logger.ForAccount(session)
                    .Error("Shop entry has no color {color} {item}",
                           item.Color, new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                    session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                    return;
                }

                //if (item.Effect != 0)
                //{
                //    if (shopItemInfo.EffectGroup.Effects.All(effect => effect.Effect != item.Effect))
                //    {
                //        Logger.ForAccount(session)
                //            .Error("Shop entry has no effect {effect} {item}",
                //                item.Effect, new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });
                //
                //        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                //        return;
                //    }
                //}

                // ToDo missing price types
                switch (shopItemInfo.PriceGroup.PriceType)
                {
                case ItemPriceType.PEN:
                    if (plr.PEN < price.Price)
                    {
                        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.NotEnoughMoney));
                        return;
                    }
                    plr.PEN -= (uint)price.Price;
                    break;

                case ItemPriceType.AP:
                case ItemPriceType.Premium:
                    if (plr.AP < price.Price)
                    {
                        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.NotEnoughMoney));
                        return;
                    }
                    plr.AP -= (uint)price.Price;
                    break;

                default:
                    Logger.ForAccount(session)
                    .Error("Unknown PriceType {priceType}", shopItemInfo.PriceGroup.PriceType);
                    return;
                }

                // ToDo
                //var purchaseDto = new PlayerPurchaseDto
                //{
                //    account_id = (int)plr.Account.Id,
                //    shop_item_id = item.ItemNumber,
                //    shop_item_info_id = shopItemInfo.Id,
                //    shop_price_id = price.Id,
                //    time = DateTimeOffset.Now.ToUnixTimeSeconds()
                //};
                //db.player_purchase.Add(purchaseDto);

                var plrItem = session.Player.Inventory.Create(shopItemInfo, price, item.Color, item.Effect, (uint)(price.PeriodType == ItemPeriodType.Units ? price.Period : 0));

                await session.SendAsync(new ItemBuyItemAckMessage(new[] { plrItem.Id }, item));

                await session.SendAsync(new MoneyRefreshCashInfoAckMessage(plr.PEN, plr.AP));
            }
        }
예제 #3
0
        public void BuyItemHandler(GameSession session, ItemBuyItemReqMessage message)
        {
            try
            {
                var shop = GameServer.Instance.ResourceCache.GetShop();
                var plr  = session.Player;
                foreach (var item in message.Items)
                {
                    var shopItemInfo = shop.GetItemInfo(item.ItemNumber, item.PriceType);
                    if (shopItemInfo == null)
                    {
                        Logger.ForAccount(session)
                        .Error("No shop entry found for {item}",
                               new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                        return;
                    }

                    if (shopItemInfo.ShopInfoType == 0)
                    {
                        Logger.ForAccount(session)
                        .Error("Shop entry is not enabled {item}",
                               new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                        return;
                    }

                    var priceGroup = shopItemInfo.PriceGroup;
                    var price      = priceGroup.GetPrice(item.PeriodType, item.Period);
                    if (price == null)
                    {
                        Logger.ForAccount(session)
                        .Error("Invalid price group for shop entry {item}",
                               new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                        return;
                    }

                    if (!price.IsEnabled)
                    {
                        Logger.ForAccount(session)
                        .Error("Shop entry is not enabled {item}",
                               new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                        return;
                    }

                    if (item.Color > shopItemInfo.ShopItem.ColorGroup)
                    {
                        Logger.ForAccount(session)
                        .Error("Shop entry has no color {color} {item}",
                               item.Color, new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                        session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                        return;
                    }

                    var itemeffects = new List <EffectNumber>();
                    if (item.Effect != 0)
                    {
                        if (shopItemInfo.EffectGroup.MainEffect == item.Effect)
                        {
                            foreach (var effect in shopItemInfo.EffectGroup.Effects)
                            {
                                itemeffects.Add(effect.Effect);
                            }
                        }
                        else
                        {
                            Logger.ForAccount(session)
                            .Error("Shop entry has no effect {effect} {item}",
                                   item.Effect, new { item.ItemNumber, item.PriceType, item.Period, item.PeriodType });

                            session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.UnkownItem));
                            return;
                        }
                    }
                    else
                    {
                        itemeffects.Add(0);
                    }

                    var oldPen = plr.PEN;
                    var oldAP  = plr.AP;

                    // ToDo missing price types
                    switch (shopItemInfo.PriceGroup.PriceType)
                    {
                    case ItemPriceType.PEN:
                        if (plr.PEN < price.Price)
                        {
                            session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.NotEnoughMoney));
                            return;
                        }

                        plr.PEN -= (uint)price.Price;
                        break;

                    case ItemPriceType.AP:
                    case ItemPriceType.Premium:
                        if (plr.AP < price.Price)
                        {
                            session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.NotEnoughMoney));
                            return;
                        }

                        plr.AP -= (uint)price.Price;
                        break;

                    case ItemPriceType.CP:
                    {
                        var CP = plr.Inventory.FirstOrDefault(p => p.ItemNumber == 6000001);
                        if (CP == null || CP.Count < price.Price)
                        {
                            session.SendAsync(new ItemBuyItemAckMessage(ItemBuyResult.NotEnoughMoney));
                            return;
                        }
                        CP.Count -= (uint)price.Price;
                        session.SendAsync(new ItemUpdateInventoryAckMessage(InventoryAction.Update, CP.Map <PlayerItem, ItemDto>()));
                    }
                    break;

                    default:
                        Logger.ForAccount(session)
                        .Error("Unknown PriceType {priceType}", shopItemInfo.PriceGroup.PriceType);
                        return;
                    }

                    PlayerItem stackitem = null;
                    var        stacked   = false;
                    switch (item.PeriodType)
                    {
                    case ItemPeriodType.None:
                        break;

                    case ItemPeriodType.Units:
                        stackitem = session.Player.Inventory.GetItemByShopInfoId((uint)shopItemInfo.Id);
                        if (stackitem != null)
                        {
                            stackitem.Count      += item.Period;
                            stackitem.NeedsToSave = true;
                            stacked = true;
                        }

                        break;

                    case ItemPeriodType.Days:
                        stackitem = session.Player.Inventory.GetItemByShopInfoId((uint)shopItemInfo.Id);
                        if (stackitem != null)
                        {
                            stackitem.DaysLeft   += item.Period;
                            stackitem.NeedsToSave = true;
                            stacked = true;
                        }
                        break;

                    case ItemPeriodType.Hours:
                        break;

                    default:
                        Logger.ForAccount(session)
                        .Error("Unknown PriceType {priceType}", item.PeriodType);
                        break;
                    }

                    var plrItem = stackitem;

                    if (!stacked)
                    {
                        plrItem = session.Player.Inventory.Create(shopItemInfo, price, item.Color,
                                                                  itemeffects.ToArray(),
                                                                  (uint)(price.PeriodType == ItemPeriodType.Units ? price.Period : 0));
                    }
                    else
                    {
                        session.SendAsync(new ItemUpdateInventoryAckMessage(InventoryAction.Update,
                                                                            plrItem.Map <PlayerItem, ItemDto>()));
                    }

                    var result = OnBuyAction(plr, plrItem);
                    if (result.Item1 && result.Item2)
                    {
                        plr.Inventory.Remove(plrItem);
                    }
                    if (result.Item1 && !result.Item2)
                    {
                        plr.AP  = oldAP;
                        plr.PEN = oldPen;
                    }

                    session.SendAsync(new ItemBuyItemAckMessage(new[] { plrItem.Id }, item));
                    session.SendAsync(new MoneyRefreshCashInfoAckMessage(plr.PEN, plr.AP));
                }
            }
            catch (Exception ex)
            {
                Logger.Information(ex.ToString());
            }
        }