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()); } }
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)); } }
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()); } }