From 979007c5d84c1065aee5a57ae88bf0119953ff9c Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Sat, 12 Dec 2020 15:21:42 +1300 Subject: [PATCH] Allow for purchasing multiple items at a time. --- DataCollection/gamedata.json | 4 + .../Horse Isle Server/Game/Messages.cs | 14 ++- .../Horse Isle Server/Server/GameDataJson.cs | 4 + .../Horse Isle Server/Server/GameServer.cs | 117 ++++++++++++++---- .../Horse Isle Server/Server/PacketBuilder.cs | 1 + 5 files changed, 112 insertions(+), 28 deletions(-) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index a6548d6..ad98cb0 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -19,7 +19,11 @@ "cant_afford_5":"You cannot afford 5 of that item!", "cant_afford_25":"You cannot afford 25 of that item!", "brought_1_but_inv_full":"Your inventory is full! Cannot buy that item.", + "brought_5_but_inv_full":"Your inventory cannot hold 5 more! Cannot buy those items.", + "brought_25_but_inv_full":"Your inventory cannot hold 25 more! Cannot buy those items.", "brought_1":"You bought a %ITEM% for $%PRICE%.", + "brought_5":"You bought 5 %ITEM% for $%PRICE%.", + "brought_25":"You bought 25 %ITEM% for $%PRICE%.", "sold_1":"You sold a %ITEM% for $%PRICE%.", "sold_all":"You sold %AMOUNT% %ITEM% for $%PRICE%." }, diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index 9cd4610..6d7a2d9 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -103,8 +103,10 @@ namespace HISP.Game public static string CantAfford25; public static string Brought1Format; public static string Brought1ButInventoryFull; - public static string Brought5; - public static string Brought25; + public static string Brought5ButInventoryFull; + public static string Brought25ButInventoryFull; + public static string Brought5Format; + public static string Brought25Format; public static string Sold1Format; public static string SoldAllFormat; @@ -153,6 +155,14 @@ namespace HISP.Game { return Sold1Format.Replace("%ITEM%", itemName).Replace("%PRICE%", price.ToString()); } + public static string FormatBuy25Message(string itemName, int price) + { + return Brought25Format.Replace("%ITEM%", itemName).Replace("%PRICE%", price.ToString()); + } + public static string FormatBuy5Message(string itemName, int price) + { + return Brought5Format.Replace("%ITEM%", itemName).Replace("%PRICE%", price.ToString()); + } public static string FormatBuyMessage(string itemName, int price) { return Brought1Format.Replace("%ITEM%", itemName).Replace("%PRICE%", price.ToString()); diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index cf6e184..06f7ac2 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -440,10 +440,14 @@ namespace HISP.Server Messages.CantAfford5 = gameData.messages.shop.cant_afford_5; Messages.CantAfford25 = gameData.messages.shop.cant_afford_25; Messages.Brought1Format = gameData.messages.shop.brought_1; + Messages.Brought5Format = gameData.messages.shop.brought_5; + Messages.Brought25Format = gameData.messages.shop.brought_25; Messages.Sold1Format = gameData.messages.shop.sold_1; Messages.SoldAllFormat = gameData.messages.shop.sold_all; Messages.Brought1ButInventoryFull = gameData.messages.shop.brought_1_but_inv_full; + Messages.Brought5ButInventoryFull = gameData.messages.shop.brought_5_but_inv_full; + Messages.Brought25ButInventoryFull = gameData.messages.shop.brought_25_but_inv_full; // Meta Format diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index 9941a76..fe6cb93 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -691,6 +691,7 @@ namespace HISP.Server } break; case PacketBuilder.ITEM_SELL: // Handles selling an item. + int message = 1; packetStr = Encoding.UTF8.GetString(packet); randomIdStr = packetStr.Substring(2, packet.Length - 2); randomId = 0; @@ -705,7 +706,7 @@ namespace HISP.Server return; } - if(!sender.LoggedinUser.Inventory.HasItem(randomId)) + if (!sender.LoggedinUser.Inventory.HasItem(randomId)) { Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to sell a item that they doesnt have in there inventory"); return; @@ -722,16 +723,18 @@ namespace HISP.Server if (shop.CanSell(itemInfo)) { sender.LoggedinUser.Money += sellPrice; - + ItemInstance itemInstance = thisItem.ItemInstances[0]; sender.LoggedinUser.Inventory.Remove(itemInstance); shop.Inventory.Add(itemInstance); - - UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y); - // Send chat message to client. - byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatSellMessage(itemInfo.Name, sellPrice), PacketBuilder.CHAT_BOTTOM_RIGHT); - sender.SendPacket(broughtItemMessage); + UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y); + if (message == 1) + { + // Send chat message to client. + byte[] soldItemMessage = PacketBuilder.CreateChat(Messages.FormatSellMessage(itemInfo.Name, sellPrice), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(soldItemMessage); + } } else @@ -741,11 +744,20 @@ namespace HISP.Server } break; case PacketBuilder.ITEM_BUY: // Handles buying an item. + message = 1; + int count = 1; + goto doPurchase; + case PacketBuilder.ITEM_BUY_5: + message = 2; + count = 5; + goto doPurchase; + + doPurchase:; packetStr = Encoding.UTF8.GetString(packet); string itemIdStr = packetStr.Substring(2, packet.Length - 2); itemId = 0; // Prevent crashing on non-int string. - try + try { itemId = Int32.Parse(itemIdStr); } @@ -757,37 +769,89 @@ namespace HISP.Server itemInfo = Item.GetItemById(itemId); shop = sender.LoggedinUser.LastShoppedAt; - if(shop != null) + if (shop != null) { - int buyCost = shop.CalculateBuyCost(itemInfo); + int buyCost = shop.CalculateBuyCost(itemInfo) * count; if (sender.LoggedinUser.Money < buyCost) { byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.CantAfford1, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(cantAffordMessage); - break; + return; } if (shop.Inventory.HasItemId(itemId)) { - sender.LoggedinUser.Money -= buyCost; - ItemInstance itemInstance = shop.Inventory.GetItemByItemId(itemId).ItemInstances[0]; - - try + if (shop.Inventory.GetItemByItemId(itemId).ItemInstances.Count < count) { - sender.LoggedinUser.Inventory.Add(itemInstance); - } - catch(InventoryException) - { - byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought1ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT); - sender.SendPacket(inventoryFullMessage); + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy more of an item than is in stock."); break; } - shop.Inventory.Remove(itemInstance); - UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y); - // Send chat message to client. - byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuyMessage(itemInfo.Name,buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT); - sender.SendPacket(broughtItemMessage); + + if (sender.LoggedinUser.Inventory.HasItemId(itemId)) + { + InventoryItem items = sender.LoggedinUser.Inventory.GetItemByItemId(itemId); + if (items.ItemInstances.Count + count > ConfigReader.MAX_STACK || sender.LoggedinUser.Inventory.Count >= Messages.DefaultInventoryMax) + { + if (message == 1) + { + byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought1ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(inventoryFullMessage); + } + else if (message == 2) + { + + byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought5ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(inventoryFullMessage); + } + else if (message == 3) + { + + byte[] inventoryFullMessage = PacketBuilder.CreateChat(Messages.Brought25ButInventoryFull, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(inventoryFullMessage); + } + break; + } + + } + + + + + for (int i = 0; i < count; i++) + { + ItemInstance itemInstance = shop.Inventory.GetItemByItemId(itemId).ItemInstances[0]; + try + { + sender.LoggedinUser.Inventory.Add(itemInstance); + } + catch (InventoryException) + { + break; + } + shop.Inventory.Remove(itemInstance); + } + + sender.LoggedinUser.Money -= buyCost; + + + // Send chat message to client. + UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y); + if (message == 1) + { + byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuyMessage(itemInfo.Name, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(broughtItemMessage); + } + else if (message == 2) + { + byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuy5Message(itemInfo.PluralName, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(broughtItemMessage); + } + else if (message == 3) + { + byte[] broughtItemMessage = PacketBuilder.CreateChat(Messages.FormatBuy25Message(itemInfo.PluralName, buyCost), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(broughtItemMessage); + } } else { @@ -799,6 +863,7 @@ namespace HISP.Server Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an item while not in a store."); } + break; case PacketBuilder.INFORMATION: diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index e81eb02..598b0ca 100644 --- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs @@ -68,6 +68,7 @@ namespace HISP.Server public const byte ITEM_DROP = 0x1E; public const byte ITEM_PICKUP = 0x14; public const byte ITEM_BUY = 0x33; + public const byte ITEM_BUY_5 = 0x35; public const byte ITEM_SELL = 0x3C; public const byte ITEM_BINOCULARS = 0x5C; public const byte ITEM_MAGNIFYING = 0x5D;