public override void AddItemToShop(Character pCharacter, PlayerShopItem Item) { if (Items.Count == 0) { Items.Add(0, Item); Item.ShopSlot = 0; } else { Items.Add((byte)Items.Count, Item); Item.ShopSlot = (byte)Items.Count; } PlayerShopPackets.PersonalShopRefresh(pCharacter, this); base.AddItemToShop(pCharacter, Item); }
private static void EnterMiniRoom(Character chr, Packet packet) { if (chr.Room != null) { miniroomLog.Info($"{chr.Name} cannot enter miniroom: already in one."); return; // Already in a Mini Room } //MessagePacket.SendNotice("PACKET: " + packet.ToString(), chr); int roomId = packet.ReadInt(); if (!MiniRoomBase.MiniRooms.TryGetValue(roomId, out var mrb)) { ReportManager.FileNewReport("Tried entering a trade room without a proper ID.", chr.ID, 0); return; // Invalid Room ID } if (mrb.EnteredUsers == 0) { return; } if (mrb.IsFull()) { miniroomLog.Info($"{chr.Name} cannot enter miniroom: already full."); return; // Error msg if full? } if (mrb.Users.ToList().Exists(u => u != null && u.MapID != chr.MapID)) { InviteResult(chr, 1); // must be on same map. Show "not found" msg return; } chr.Room = mrb; byte nType = (byte)chr.Room.Type; switch (nType) { case 1: // Omok { bool usePassword = packet.ReadBool(); Omok omok = MiniRoomBase.Omoks[chr.Room.ID]; if (usePassword) { string password = packet.ReadString(); if (password != omok.Password) { miniroomLog.Info($"{chr.Name} cannot enter omok: invalid password"); MiniGamePacket.ErrorMessage(chr, MiniGamePacket.MiniGameError.IncorrectPassword); chr.Room = null; break; } } if (chr.Inventory.Mesos >= 100) { omok.AddPlayer(chr); MiniGamePacket.AddVisitor(chr, mrb); MiniGamePacket.ShowWindow(chr, mrb, omok.OmokType); chr.AddMesos(-100); miniroomLog.Info($"{chr.Name} entered omok"); } else { miniroomLog.Info($"{chr.Name} cannot enter omok: not enough mesos"); MiniGamePacket.ErrorMessage(chr, MiniGamePacket.MiniGameError.NotEnoughMesos); } break; } case 3: // Trade { miniroomLog.Info($"{chr.Name} entered trade"); mrb.AddPlayer(chr); MiniRoomPacket.ShowJoin(mrb, chr); MiniRoomPacket.ShowWindow(mrb, chr); break; } case 4: // Player Shop { miniroomLog.Info($"{chr.Name} entered playershop"); PlayerShop shop = MiniRoomBase.PlayerShops[roomId]; for (int i = 0; i < shop.EnteredUsers; i++) { Character shopUser = mrb.Users[i]; if (shopUser != null && shopUser != chr) { shop.AddPlayer(chr); PlayerShopPackets.AddPlayer(chr, shopUser); PlayerShopPackets.OpenPlayerShop(chr, mrb); PlayerShopPackets.PersonalShopRefresh(chr, shop); //Show items } } break; } } }
public void BuyItem(Character pCharacter, byte slot, short quantity) { //This may seem confusing, but the client calculates the amount left itself. //The formula is bundles * bundleamount, so if you have 2 bundles with 25 in each, it will obviously show 50. If you have 100 items in 1 bundle, it will show you 100 PlayerShopItem pst = Items[slot]; PlayerShop ps = MiniRoomBase.PlayerShops[pCharacter.Room.ID]; if (pst == null) { return; } if (pCharacter.AssertForHack( quantity < 0, $"PlayerShop hack: trying to buy negative amount. Requested {quantity}" )) { return; } if (pst.sItem.Amount <= 0) { // TODO: Get packet? return; } var cost = quantity * pst.Price; var realAmount = (short)(quantity * pst.BundleAmount); if (cost > pCharacter.Inventory.Mesos) { // TODO: Get packet? return; } if (pCharacter.AssertForHack( pst.Bundles < quantity, $"PlayerShop hack: buying more than there's in store. Bundle: {pst.Bundles}, requested {quantity}" )) { return; } if (pCharacter.AssertForHack( pst.sItem.Amount < realAmount, $"PlayerShop hack: buying more than there's in store. Item amount: {pst.sItem.Amount}, requested {realAmount}" )) { return; } pCharacter.Inventory.AddNewItem(pst.sItem.ItemID, realAmount); pCharacter.AddMesos(-cost); Owner.AddMesos(cost); MesosTransfer.PlayerBuysFromPersonalShop(pCharacter.ID, Owner.ID, cost, _transaction); ItemTransfer.PersonalShopBoughtItem(Owner.ID, pCharacter.ID, pst.sItem.ItemID, realAmount, TransactionID, pst.sItem); pst.Bundles -= quantity; pst.sItem.Amount -= realAmount; PlayerShopPackets.PersonalShopRefresh(pCharacter, ps); PlayerShopPackets.SoldItemResult(Owner, pCharacter, slot, quantity); }