Пример #1
0
 public void UseCapsuleReq(GameSession session, CUseCapsuleReqMessage message)
 {
     session.SendAsync(new SServerResultInfoAckMessage((ServerResult)1));
     //session.Send(new SUseCapsuleAckMessage(new List<CapsuleRewardDto>
     //{
     //    new CapsuleRewardDto(CapsuleRewardType.Item, 0, 64, 0),
     //    new CapsuleRewardDto(CapsuleRewardType.Item, 0, 154, 123),
     //    new CapsuleRewardDto(CapsuleRewardType.PEN, 9999, 0, 0),
     //    //new CapsuleRewardDto(CapsuleRewardType.PEN, 2, 0, 0),
     //    //new CapsuleRewardDto(CapsuleRewardType.PEN, 3, 0, 0),
     //}, 3));
 }
Пример #2
0
        public void UseCapsuleReq(GameSession session, CUseCapsuleReqMessage message)
        {
            var ItemBags = GameServer.Instance.ResourceCache.GetItemRewards();
            var plr      = session.Player;
            var item     = plr.Inventory[message.ItemId];

            if (!ItemBags.ContainsKey(item.ItemNumber))
            {
                session.SendAsync(new SServerResultInfoAckMessage(ServerResult.DBError));
                return;
            }

            item.Count--;
            if (item.Count <= 0)
            {
                plr.Inventory.Remove(item);
            }
            else
            {
                session.SendAsync(new SInventoryActionAckMessage(InventoryAction.Update, item.Map <PlayerItem, ItemDto>()));
            }

            var ItemBag = ItemBags[item.ItemNumber];

            var Rewards = (from bag in ItemBag.Bags
                           let reward = bag.Take()
                                        select new CapsuleRewardDto
            {
                RewardType = reward.Type,
                ItemNumber = reward.Item,
                PriceType = reward.PriceType,
                PeriodType = reward.PeriodType,
                Period = reward.Period,
                PEN = reward.PEN,
                Effect = reward.Effect,
                Unk = (byte)reward.Color
            }).ToArray();

            foreach (var it in Rewards)
            {
                if (it.RewardType == CapsuleRewardType.PEN)
                {
                    plr.PEN += it.PEN;
                }
                else
                {
                    if (it.PeriodType == ItemPeriodType.Units)
                    {
                        var prev = plr.Inventory
                                   .FirstOrDefault(p => p.ItemNumber == it.ItemNumber &&
                                                   p.PeriodType == it.PeriodType &&
                                                   p.PriceType == it.PriceType &&
                                                   p.Effect == it.Effect);

                        if (prev == null || prev.ItemNumber == 0)
                        {
                            plr.Inventory.Create(it.ItemNumber, it.PriceType, it.PeriodType, (ushort)it.Period, it.Unk, it.Effect, 1);
                        }
                        else
                        {
                            prev.Count++;
                            session.SendAsync(new SInventoryActionAckMessage(InventoryAction.Update, prev.Map <PlayerItem, ItemDto>()));
                        }
                    }
                    else
                    {
                        plr.Inventory.Create(it.ItemNumber, it.PriceType, it.PeriodType, (ushort)it.Period, it.Unk, it.Effect, 1);
                    }
                }
            }

            session.SendAsync(new SUseCapsuleAckMessage(Rewards, 3));
            session.SendAsync(new SRefreshCashInfoAckMessage(plr.PEN, plr.AP));
        }