public void GameshopBuy(int GIndex, byte Quantity) { if (Quantity < 1) return; List<GameShopItem> shopList = Envir.GameShopList; GameShopItem Product = null; int purchased; bool stockAvailable = false; bool canAfford = false; uint CreditCost =0; uint GoldCost = 0; List<UserItem> mailItems = new List<UserItem>(); for (int i = 0; i < shopList.Count; i++) { if (shopList[i].GIndex == GIndex) { Product = shopList[i]; break; } } if (Product == null) { ReceiveChat("You're trying to buy an item that isn't in the shop.", ChatType.System); SMain.EnqueueDebugging(Info.Name + " is trying to buy " + Product.Info.FriendlyName + " x " + Quantity + " - Item isn't in the shop."); return; } if (Product.Stock != 0) { if (Product.iStock) //Invididual Stock { Info.GSpurchases.TryGetValue(Product.Info.Index, out purchased); } else //Server Stock { Envir.GameshopLog.TryGetValue(Product.Info.Index, out purchased); } if (Product.Stock - purchased - Quantity >= 0) { stockAvailable = true; } else { ReceiveChat("You're trying to buy more of this item than is available.", ChatType.System); GameShopStock(Product); SMain.EnqueueDebugging(Info.Name + " is trying to buy " + Product.Info.FriendlyName + " x " + Quantity + " - Stock isn't available."); return; } } else { stockAvailable = true; } if (stockAvailable) { SMain.EnqueueDebugging(Info.Name + " is trying to buy " + Product.Info.FriendlyName + " x " + Quantity + " - Stock is available"); if (Product.CreditPrice * Quantity < Account.Credit) { canAfford = true; CreditCost = (Product.CreditPrice * Quantity); } else { //Needs to attempt to pay with gold and credits if (Account.Gold >= (((Product.GoldPrice * Quantity) / (Product.CreditPrice * Quantity)) * ((Product.CreditPrice * Quantity) - Account.Credit))) { GoldCost = ((Product.GoldPrice * Quantity) / (Product.CreditPrice * Quantity)) * ((Product.CreditPrice * Quantity) - Account.Credit); CreditCost = Account.Credit; canAfford = true; } else { ReceiveChat("You don't have enough currency for your purchase.", ChatType.System); SMain.EnqueueDebugging(Info.Name + " is trying to buy " + Product.Info.FriendlyName + " x " + Quantity + " - not enough currency."); return; } } } else { return; } if (canAfford) { SMain.EnqueueDebugging(Info.Name + " is trying to buy " + Product.Info.FriendlyName + " x " + Quantity + " - Has enough currency."); Account.Gold -= GoldCost; Account.Credit -= CreditCost; Report.GoldChanged("GameShop", GoldCost, true, Product.Info.FriendlyName); Report.CreditChanged("GameShop", CreditCost, true, Product.Info.FriendlyName); if (GoldCost != 0) Enqueue(new S.LoseGold { Gold = GoldCost }); if (CreditCost != 0) Enqueue(new S.LoseCredit { Credit = CreditCost }); int Purchased; if (Product.iStock && Product.Stock != 0) { Info.GSpurchases.TryGetValue(Product.Info.Index, out Purchased); if (Purchased == 0) { Info.GSpurchases[Product.GIndex] = Quantity; } else { Info.GSpurchases[Product.GIndex] += Quantity; } } Purchased = 0; Envir.GameshopLog.TryGetValue(Product.Info.Index, out Purchased); if (Purchased == 0) { Envir.GameshopLog[Product.GIndex] = Quantity; } else { Envir.GameshopLog[Product.GIndex] += Quantity; } if (Product.Stock != 0) GameShopStock(Product); } else { return; } Report.ItemGSBought("GameShop", Product, Quantity, CreditCost, GoldCost); uint quantity = (Quantity * Product.Count); if (Product.Info.StackSize <= 1 || quantity == 1) { for (int i = 0; i < Quantity; i++) { UserItem mailItem = Envir.CreateFreshItem(Envir.GetItemInfo(Product.Info.Index)); mailItems.Add(mailItem); } } else { while (quantity > 0) { UserItem mailItem = Envir.CreateFreshItem(Envir.GetItemInfo(Product.Info.Index)); mailItem.Count = 0; for (int i = 0; i < mailItem.Info.StackSize; i++) { mailItem.Count++; quantity--; if (quantity == 0) break; } if (mailItem.Count == 0) break; mailItems.Add(mailItem); } } MailInfo mail = new MailInfo(Info.Index) { MailID = ++Envir.NextMailID, Sender = "Gameshop", Message = "Thank you for your purchase from the Gameshop. Your item(s) are enclosed.", Items = mailItems, }; mail.Send(); SMain.EnqueueDebugging(Info.Name + " is trying to buy " + Product.Info.FriendlyName + " x " + Quantity + " - Purchases Sent!"); ReceiveChat("Your purchases have been sent to your Mailbox.", ChatType.Hint); }
public void SendMail(string name, string message, uint gold, ulong[] items, bool stamped) { CharacterInfo player = Envir.GetCharacterInfo(name); if (player == null) { ReceiveChat(string.Format("Could not find player {0}", name), ChatType.System); return; } bool hasStamp = false; uint totalGold = 0; uint parcelCost = GetMailCost(items, gold, stamped); totalGold = gold + parcelCost; if (Account.Gold < totalGold) { Enqueue(new S.MailSent { Result = -1 }); return; } //Validate user has stamp if (stamped) { for (int i = 0; i < Info.Inventory.Length; i++) { UserItem item = Info.Inventory[i]; if (item == null || item.Info.Type != ItemType.Nothing || item.Info.Shape != 1 || item.Count < 1) continue; hasStamp = true; if (item.Count > 1) item.Count--; else Info.Inventory[i] = null; Enqueue(new S.DeleteItem { UniqueID = item.UniqueID, Count = 1 }); break; } } List<UserItem> giftItems = new List<UserItem>(); for (int j = 0; j < (hasStamp ? 5 : 1); j++) { if (items[j] < 1) continue; for (int i = 0; i < Info.Inventory.Length; i++) { UserItem item = Info.Inventory[i]; if (item == null || items[j] != item.UniqueID) continue; giftItems.Add(item); Info.Inventory[i] = null; Enqueue(new S.DeleteItem { UniqueID = item.UniqueID, Count = item.Count }); } } if (totalGold > 0) { Account.Gold -= totalGold; Enqueue(new S.LoseGold { Gold = totalGold }); } //Create parcel MailInfo mail = new MailInfo(player.Index, true) { MailID = ++Envir.NextMailID, Sender = Info.Name, Message = message, Gold = gold, Items = giftItems }; mail.Send(); Enqueue(new S.MailSent { Result = 1 }); }
public void SendMail(string name, string message) { CharacterInfo player = Envir.GetCharacterInfo(name); if (player == null) { ReceiveChat(string.Format("Could not find player {0}", name), ChatType.System); return; } if (player.Friends.Any(e => e.Info == Info && e.Blocked)) { ReceiveChat("Player is not accepting your mail.", ChatType.System); return; } if (Info.Friends.Any(e => e.Info == player && e.Blocked)) { ReceiveChat("Cannot mail player whilst they are on your blacklist.", ChatType.System); return; } //sent from player MailInfo mail = new MailInfo(player.Index, true) { Sender = Info.Name, Message = message, Gold = 0 }; mail.Send(); }
public void GainItemMail(UserItem item, int reason) { string sender = "Bichon Administrator"; string message = "You have been automatically sent an item \r\ndue to the following reason.\r\n"; switch (reason) { case 1: message = "Could not return item to bag after trade."; break; default: message = "No reason provided."; break; } //sent from player MailInfo mail = new MailInfo(Info.Index) { Sender = sender, Message = message }; mail.Items.Add(item); mail.Send(); }
public void SendMail(string name, string message) { CharacterInfo player = Envir.GetCharacterInfo(name); if(player == null) { ReceiveChat(string.Format("Could not find player {0}", name), ChatType.System); return; } //sent from player MailInfo mail = new MailInfo(player.Index, true) { Sender = Info.Name, Message = message, Gold = 0 }; mail.Send(); }
public void SendParcel(string name, string message, uint gold, ulong[] items) { CharacterInfo player = Envir.GetCharacterInfo(name); if (player == null) { ReceiveChat(string.Format("Could not find player {0}", name), ChatType.System); return; } List<UserItem> giftItems = new List<UserItem>(); if (Account.Gold < gold) { Enqueue(new S.MailSent { Result = -1 }); return; } for (int j = 0; j < 5; j++) { if (items[j] < 1) continue; for (int i = 0; i < Info.Inventory.Length; i++) { UserItem item = Info.Inventory[i]; if (item == null || items[j] != item.UniqueID) continue; giftItems.Add(item); Info.Inventory[i] = null; Enqueue(new S.DeleteItem { UniqueID = item.UniqueID, Count = item.Count }); } } if (gold > 0) { Account.Gold -= gold; Enqueue(new S.LoseGold { Gold = gold }); } //sent from client MailInfo mail = new MailInfo(player.Index, true) { MailID = ++Envir.NextMailID, Sender = Info.Name, Message = message, Gold = gold, Items = giftItems }; mail.Send(); Enqueue(new S.MailSent { Result = 1 }); }