public static void OnBuyItem(WorldClient client, INetPacketStream packet) { var buyItemPacket = new BuyItemPacket(packet); var npcShopEvent = new NpcShopBuyEventArgs(buyItemPacket.ItemId, buyItemPacket.Quantity, buyItemPacket.Tab, buyItemPacket.Slot); client.Player.NotifySystem <NpcShopSystem>(npcShopEvent); }
public void OnBuyItem(IWorldClient client, BuyItemPacket packet) { var npcShopItem = new NpcShopItemInfo { ItemId = packet.ItemId, Slot = packet.Slot, Tab = packet.Tab }; _npcShopSystem.BuyItem(client.Player, npcShopItem, packet.Quantity); }
public static void Handle(Packet packet) { var buyItemPacket = new BuyItemPacket(packet); // Check if the item really exists if (buyItemPacket.TableIndex > ServerMain.Items.Count) { packet.Sender.SendDebugError($"Item {buyItemPacket.TableIndex} out of range!"); #if !DEBUG packet.Sender.KillConnection("Invalid shop item"); #endif return; } var itemData = ServerMain.Items[buyItemPacket.TableIndex]; #if DEBUG Log.Debug($"{itemData.Id} - {itemData.Name} - {buyItemPacket.TableIndex}"); #endif // Get price for single item int price; if (!int.TryParse(itemData.BuyValue, out price) || itemData.BuyValue == "n/a") { packet.Sender.SendDebugError($"No price ({itemData.BuyValue}) for item {itemData.Name}"); #if !DEBUG packet.Sender.KillConnection("Price missing!"); #endif return; } price = price * (int)buyItemPacket.Quantity; var character = packet.Sender.User.ActiveCharacter; // Check money if (character.MitoMoney < price) { packet.Sender.SendDebugError("Not enough money"); return; } // Give the item to user var inventoryItem = character.GiveItem(GameServer.Instance.Database.Connection, buyItemPacket.TableIndex, buyItemPacket.Quantity); if (inventoryItem == null) { packet.Sender.SendDebugError("Giving item failed"); return; } // Finally update money character.MitoMoney -= price; CharacterModel.Update(GameServer.Instance.Database.Connection, character); var ack = new BuyItemAnswer() { ItemId = buyItemPacket.TableIndex, Quantity = buyItemPacket.Quantity, Price = price, }; packet.Sender.Send(ack.CreatePacket()); character.FlushItemModBuffer(packet.Sender); }
public static void HandleOutgoingPacket(byte[] bytes) { if (!Enum.IsDefined(typeof(OutGoingPacket), bytes[0])) { Log.Information($"Send unknown D2GS packet of type: 0x{(byte)bytes[0],2:X2} with data {bytes.ToPrintString()}"); return; } var packetType = (OutGoingPacket)bytes[0]; switch (packetType) { case OutGoingPacket.Run: var runToLocationPacket = new RunToLocationPacket(bytes); Log.Information($"RunToLocationPacket -> {runToLocationPacket.GetLocation()}"); break; case OutGoingPacket.BuyItem: var buyItemPacket = new BuyItemPacket(bytes); Log.Information($"BuyItem -> {buyItemPacket.GetItemId()} with data {bytes.ToPrintString()}"); break; case OutGoingPacket.SellItem: var sellItemPacket = new SellItemPacket(bytes); Log.Information($"SellItem -> {sellItemPacket.GetItemId()}"); break; case OutGoingPacket.EntityInteract: var interactWithEntityPacket = new InteractWithEntityPacket(bytes); Log.Information($"EntityInteract -> ID: {interactWithEntityPacket.GetEntityId()} Type: {interactWithEntityPacket.GetEntityType()}"); Log.Debug($"{bytes.ToPrintString()}"); break; case OutGoingPacket.Walk: case OutGoingPacket.WalkToUnit: case OutGoingPacket.RunToUnit: case OutGoingPacket.ShiftLeftClick: case OutGoingPacket.LeftClickUnit: case OutGoingPacket.ShiftLeftClickUnit: case OutGoingPacket.ShiftLeftClickHold: case OutGoingPacket.LeftClickHoldUnit: case OutGoingPacket.ShiftLeftClickHoldUnit: case OutGoingPacket.RightSkillOnLocation: case OutGoingPacket.RightSkillOnUnit: case OutGoingPacket.ShiftRightClickUnit: case OutGoingPacket.RightSkillRepeatOnLocation: case OutGoingPacket.RightClickHoldUnit: case OutGoingPacket.ShiftRightClickHoldUnit: case OutGoingPacket.OverheadChat: case OutGoingPacket.Chat: case OutGoingPacket.PickItem: case OutGoingPacket.DropItem: case OutGoingPacket.InsertItemToBuffer: case OutGoingPacket.RemoveItemFromBuffer: case OutGoingPacket.EquipItem: case OutGoingPacket.Swap2HItem: case OutGoingPacket.RemoveBodyItem: case OutGoingPacket.SwapCursorWithBody: case OutGoingPacket.Swap1HItemWith2HItem: case OutGoingPacket.SwapCursorAndBufferItem: case OutGoingPacket.ActivateBufferItem: case OutGoingPacket.StackItems: case OutGoingPacket.UnstackItems: case OutGoingPacket.ItemToBelt: case OutGoingPacket.ItemFromBelt: case OutGoingPacket.SwapBeltItem: case OutGoingPacket.UseBeltItem: case OutGoingPacket.IdentifyItem: case OutGoingPacket.SocketItem: case OutGoingPacket.ScrollToBook: case OutGoingPacket.ItemToCube: case OutGoingPacket.InitiateEntityChat: case OutGoingPacket.TerminateEntityChat: case OutGoingPacket.QuestMessage: case OutGoingPacket.IdentifyItems: case OutGoingPacket.Repair: case OutGoingPacket.HireMerc: case OutGoingPacket.IdentifyFromGamble: case OutGoingPacket.EntityAction: case OutGoingPacket.PurchaseLife: case OutGoingPacket.AddStatPoint: case OutGoingPacket.AddSkillPoint: case OutGoingPacket.SelectSkill: case OutGoingPacket.HighlightDoor: case OutGoingPacket.ActivateInifussScroll: case OutGoingPacket.PlayAudio: case OutGoingPacket.RequestQuestData: case OutGoingPacket.Resurrect: case OutGoingPacket.InsertHoradricStaff: case OutGoingPacket.HaveMercInteract: case OutGoingPacket.MoveMerc: case OutGoingPacket.TurnOffBusy: case OutGoingPacket.TakeWaypoint: case OutGoingPacket.RequestEntityUpdate: case OutGoingPacket.Transmute: case OutGoingPacket.PlayNPCMessage: case OutGoingPacket.ClickButton: case OutGoingPacket.DropGold: case OutGoingPacket.BindHotkey: case OutGoingPacket.QuestComplete: case OutGoingPacket.MakeEntityMove: case OutGoingPacket.SetPlayerRelation: case OutGoingPacket.InvitePlayer: case OutGoingPacket.UpdatePlayerLocation: case OutGoingPacket.SwapWeapons: case OutGoingPacket.DropOrEquipMercItem: case OutGoingPacket.ResurrectMerc: case OutGoingPacket.SendItemToBelt: case OutGoingPacket.GameLogon: case OutGoingPacket.LeaveGame: case OutGoingPacket.Startup: case OutGoingPacket.JoinGame: case OutGoingPacket.Ping: if (Log.IsEnabled(Serilog.Events.LogEventLevel.Debug)) { Log.Debug($"Outgoing packet {packetType} with data: {bytes.ToPrintString()}"); } else { Log.Information($"Outgoing packet {packetType}"); } break; } }