public void AddMesos(MapleCharacter chr, long mesos) { if (Type == TradeType.Trade && Partners.Count == 1 && Partners[0].Trade == this) { if (chr == Owner) { if (OwnerMesos + mesos <= chr.Inventory.Mesos) { OwnerMesos += mesos; } Owner.Client.SendPacket(UpdateTradeMesos(OwnerMesos, 0)); Partners[0].Client.SendPacket(UpdateTradeMesos(OwnerMesos, 1)); MapleInventory.UpdateMesos(Owner.Client, Owner.Inventory.Mesos - OwnerMesos); } else if (chr == Partners[0]) { if (PartnerMesos + mesos <= chr.Inventory.Mesos) { PartnerMesos += mesos; } Owner.Client.SendPacket(UpdateTradeMesos(PartnerMesos, 1)); Partners[0].Client.SendPacket(UpdateTradeMesos(PartnerMesos, 0)); MapleInventory.UpdateMesos(Partners[0].Client, Partners[0].Inventory.Mesos - PartnerMesos); } } }
private static bool GetAndCheckItemsFromInventory(MapleInventory inventory, short equipSlot, short scrollSlot, out MapleEquip equip, out MapleItem scroll) { MapleInventoryType equipInventory = equipSlot < 0 ? MapleInventoryType.Equipped : MapleInventoryType.Equip; equip = inventory.GetItemSlotFromInventory(equipInventory, equipSlot) as MapleEquip; scroll = inventory.GetItemSlotFromInventory(MapleInventoryType.Use, scrollSlot); return(equip != null && scroll != null); }
public static void Handle(MapleClient c, PacketReader pw) { MapleCharacter chr = c.Account.Character; if (!chr.DisableActions()) { return; } int tickCount = pw.ReadInt(); MapleInventoryType type = (MapleInventoryType)pw.ReadByte(); short oldPosition = pw.ReadShort(); short newPosition = pw.ReadShort(); short quantity = pw.ReadShort(); bool success = false; if (oldPosition == newPosition) { return; } try { MapleInventory inventory = chr.Inventory; if (newPosition < 0 && oldPosition > 0) //equip item { success = inventory.EquipItem(oldPosition, newPosition); } else if (oldPosition < 0 && newPosition > 0) //unequip item { success = inventory.UnEquip(oldPosition, newPosition); } else if (newPosition == 0) //drop item { if (!chr.Map.DropItemLimit) { success = inventory.DropItem(type, oldPosition, quantity); } } else //item moved within inventory { success = inventory.MoveItem(type, oldPosition, newPosition); } } finally { chr.EnableActions(!success); } }
public void Close(bool finished, bool success) //may be different for non-trade types like shops { Owner.Trade = null; if (Owner.Client != null) { Owner.Client.SendPacket(GenerateTradeClose(finished, success)); MapleInventory.UpdateMesos(Owner.Client, Owner.Inventory.Mesos); if (!success || !finished) { foreach (TradeItem item in items[0]) { if (item != null) { Owner.Client.SendPacket(MapleInventory.Packets.AddItem(item.Item, item.Item.InventoryType, item.Item.Position)); //force the "hidden" items to reappear } } Owner.EnableActions(); } else Owner.EnableActions(false); } foreach (MapleCharacter chr in Partners.Where(chr => chr.Trade == this)) { chr.Client.SendPacket(GenerateTradeClose(finished, success)); chr.Trade = null; MapleInventory.UpdateMesos(chr.Client, chr.Inventory.Mesos); if (Type == TradeType.Trade) { if (!success || !finished) { foreach (TradeItem item in items[1]) { if (item == null) continue; chr.Client.SendPacket(MapleInventory.Packets.AddItem(item.Item, item.Item.InventoryType, item.Item.Position)); } } } chr.EnableActions(false); } TradeIDs.Remove(TradeID); }
public static void Handle(MapleClient c, PacketReader pr) { try { if (c.NpcEngine != null && c.NpcEngine.IsShop) { byte mode = pr.ReadByte(); int NpcId = c.NpcEngine.NpcId; switch (mode) { case 0: { short shopIndex = pr.ReadShort(); int itemId = pr.ReadInt(); short amount = pr.ReadShort(); c.NpcEngine.BuyItem(itemId, shopIndex, amount); break; } case 1: //sell { short inventoryIndex = pr.ReadShort(); int itemId = pr.ReadInt(); short qty = pr.ReadShort(); MapleInventoryType invType = ItemConstants.GetInventoryType(itemId); switch (invType) { case MapleInventoryType.Equip: case MapleInventoryType.Etc: case MapleInventoryType.Setup: case MapleInventoryType.Use: break; default: return; // Not a valid item } WzItem wzitem = DataBuffer.GetItemById(itemId); if (wzitem == null) { wzitem = DataBuffer.GetEquipById(itemId); } if (wzitem == null) // Item doesnt exist (anymore?) { return; } if (wzitem.NotSale || wzitem.IsCashItem || wzitem.IsQuestItem) { return; } byte response = 0; if (!wzitem.IsQuestItem) { MapleInventory inventory = c.Account.Character.Inventory; MapleItem item = inventory.GetItemSlotFromInventory(invType, inventoryIndex); if (item?.ItemId == itemId && item.Quantity >= qty) { if (inventory.Mesos + wzitem.Price > GameConstants.MAX_MESOS) { response = 2; // You do not have enough mesos } else { inventory.RemoveItemsFromSlot(item.InventoryType, item.Position, qty, true); inventory.GainMesos(wzitem.Price * qty, false, false); } // TODO: buyback } } PacketWriter pw = new PacketWriter(); pw.WriteHeader(SendHeader.NpcTransaction); pw.WriteByte(response); pw.WriteByte(0); pw.WriteByte(0); c.SendPacket(pw); break; } case 3: { c.NpcEngine.Dispose(); break; } default: { c.NpcEngine.ScriptInstance = null; ServerConsole.Warning("Unkown NpcShopActionHandler mode:" + mode); ServerConsole.Info(Functions.ByteArrayToStr(pr.ToArray())); break; } } } } catch (Exception ex) { ServerConsole.Error("NpcShopActionHandler Failure"); ServerConsole.Error(ex.Message); if (c.NpcEngine != null) { c.NpcEngine.Dispose(); } } }