From be568159963a9e99ef7c874e96e4b3bfa3d94f37 Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Thu, 31 Dec 2020 14:22:56 +1300 Subject: [PATCH] Add inns. --- DataCollection/gamedata.json | 38 ++++-- .../Game/Inventory/IInventory.cs | 7 +- .../Game/Inventory/InventoryItem.cs | 2 +- .../Game/Inventory/PlayerInventory.cs | 4 +- .../Game/Inventory/ShopInventory.cs | 6 +- .../Horse Isle Server/Game/Item.cs | 35 +++++- .../Horse Isle Server/Game/Messages.cs | 17 ++- .../Horse Isle Server/Game/Meta.cs | 29 ++++- .../Horse Isle Server/Game/Quest.cs | 1 + .../Horse Isle Server/Game/Services/Inn.cs | 84 ++++++++++++++ .../Game/{ => Services}/Shop.cs | 5 +- .../Game/{ => Services}/Transport.cs | 8 +- .../Horse Isle Server.csproj | 5 +- .../Horse Isle Server/Player/User.cs | 3 + .../Horse Isle Server/Server/GameDataJson.cs | 58 +++++++--- .../Horse Isle Server/Server/GameServer.cs | 108 +++++++++++++----- .../Horse Isle Server/Server/PacketBuilder.cs | 1 + 17 files changed, 333 insertions(+), 78 deletions(-) create mode 100644 Horse Isle Server/Horse Isle Server/Game/Services/Inn.cs rename Horse Isle Server/Horse Isle Server/Game/{ => Services}/Shop.cs (95%) rename Horse Isle Server/Horse Isle Server/Game/{ => Services}/Transport.cs (91%) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 86a030d..ef60e3c 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -12,6 +12,18 @@ "click_nothing_message":"Nothing interesting here...", "playtime_timeout":"You have run out of playtime for now. In one minute you will be disconnected. You gain one minute of playtime every 8 minutes. Please come back later!", "random_movement":"You are sooo %STAT%. You wander dizzily in a different direction.", + "inn":{ + "cant_afford":"You cannot afford that service!", + "enjoyed_service":"You enjoyed your %ITEM% for $%PRICE%.", + "fully_rested":"You are now completely rested!" + }, + "water_balloon_game":{ + "money_prize":20000, + "starting_amount":8, + "start_message":"WATER BALLOON FIGHT: You have just been given %AMOUNT% Water Balloons. Whoever gets hit the MOST in 5 minutes (60 game minutes) will win a prize (hits on yourself are not counted).", + "winner_message":"You are a Water Balloon winner! Prize: $%PRIZE%", + "end_message_winner":"WATER BALLOON FIGHT OVER: Here were the winners:
%USERNAME% was hit %AMOUNT% times." + }, "fountain":{ "drank_your_fill":"You drank your fill from the fountain.", "dropped_money":"Oh no!!! While drinking you accidentally dropped $%MONEY% into the fountain!! There is no way to get it back!", @@ -106,6 +118,11 @@ "back_to_map":"^M", "long_full_line":"^L", "fountain":"Although it's not recommended, you could drink from this fountain if you are thirsty...^T6Drink from the public fountain. ^B1D^R1^X^Z", + "inn":{ + "buy_meal":"^LYou can buy the following meals:^R1", + "buy_rest":"^LWe also offer the following rest options:^R1", + "inn_entry":"^I%ICON%^T4%NAME% $%PRICE%^B4BC%ID%^B4LN%ID%^R1", + }, "awards_page":{ "awards_header":"^ATYour Awards Earned^H", "no_awards":"
You have not earned any awards yet. You can view a list of earnable awards in a Horse Isle Library.", @@ -508,13 +525,20 @@ "pm_sound":"PM" } }, - "water_balloon_game":{ - "money_prize":20000, - "starting_amount":8, - "start_message":"WATER BALLOON FIGHT: You have just been given %AMOUNT% Water Balloons. Whoever gets hit the MOST in 5 minutes (60 game minutes) will win a prize (hits on yourself are not counted).", - "winner_message":"You are a Water Balloon winner! Prize: $%PRIZE%", - "end_message_winner":"WATER BALLOON FIGHT OVER: Here were the winners:
%USERNAME% was hit %AMOUNT% times." - }, + "inns":[ + {"id":2,"rests_offered":[45],"meals_offered":[47,130],"buy_percent":125}, + {"id":1,"rests_offered":[45,46],"meals_offered":[48,132],"buy_percent":110}, + {"id":3,"rests_offered":[45,46],"meals_offered":[49,131],"buy_percent":110}, + {"id":4,"rests_offered":[45],"meals_offered":[128,126],"buy_percent":127}, + {"id":5,"rests_offered":[45,46],"meals_offered":[133,127],"buy_percent":110}, + {"id":6,"rests_offered":[136],"meals_offered":[153],"buy_percent":100}, + {"id":7,"rests_offered":[45,46],"meals_offered":[134,129],"buy_percent":115}, + {"id":11,"rests_offered":[45,46],"meals_offered":[48,132,348],"buy_percent":127}, + {"id":9,"rests_offered":[45],"meals_offered":[153,345,346,128],"buy_percent":110}, + {"id":10,"rests_offered":[45,46],"meals_offered":[493,126,130,129],"buy_percent":115}, + {"id":8,"rests_offered":[45,46],"meals_offered":[48,132,127],"buy_percent":120}, + {"id":12,"rests_offered":[],"meals_offered":[129,126,132,537,348],"buy_percent":120} + ], "tile_paramaters":{ "terrain_tiles":[ {"passable":false,"tile_type":"WATER"}, diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/IInventory.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/IInventory.cs index 0bc4d06..4e8adfe 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Inventory/IInventory.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/IInventory.cs @@ -1,8 +1,5 @@ -using System; -using System.Collections.Generic; - - -namespace HISP.Game + +namespace HISP.Game.Inventory { interface IInventory diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/InventoryItem.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/InventoryItem.cs index 2e7e132..d137f97 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Inventory/InventoryItem.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/InventoryItem.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -namespace HISP.Game +namespace HISP.Game.Inventory { class InventoryItem { diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/PlayerInventory.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/PlayerInventory.cs index 24d1df0..6c46156 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Inventory/PlayerInventory.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/PlayerInventory.cs @@ -1,9 +1,9 @@ using System.Collections.Generic; using System.Linq; -using HISP.Game; +using HISP.Player; using HISP.Server; -namespace HISP.Player +namespace HISP.Game.Inventory { class PlayerInventory : IInventory diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/ShopInventory.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/ShopInventory.cs index 3f97ce4..a1cb2a3 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Inventory/ShopInventory.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/ShopInventory.cs @@ -1,9 +1,9 @@ -using HISP.Server; -using System; +using HISP.Game.Services; +using HISP.Server; using System.Collections.Generic; using System.Linq; -namespace HISP.Game +namespace HISP.Game.Inventory { class ShopInventory : IInventory { diff --git a/Horse Isle Server/Horse Isle Server/Game/Item.cs b/Horse Isle Server/Horse Isle Server/Game/Item.cs index 184a2e0..4ce959f 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Item.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Item.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using HISP.Player; +using HISP.Server; +using System.Collections.Generic; namespace HISP.Game { @@ -55,6 +57,37 @@ namespace HISP.Game public static int Telescope; public static int Pitchfork; + public static bool ConsumeItem(User user, ItemInformation itmInfo) + { + + bool toMuch = false; + foreach (Item.Effects effect in itmInfo.Effects) + { + switch (effect.EffectsWhat) + { + case "TIREDNESS": + if (user.Tiredness + effect.EffectAmount > 1000) + toMuch = true; + user.Tiredness += effect.EffectAmount; + break; + case "THIRST": + if (user.Thirst + effect.EffectAmount > 1000) + toMuch = true; + user.Thirst += effect.EffectAmount; + break; + case "HUNGER": + if (user.Hunger + effect.EffectAmount > 1000) + toMuch = true; + user.Hunger += effect.EffectAmount; + break; + default: + Logger.ErrorPrint("Unknown effect: " + effect.EffectsWhat); + break; + + } + } + return toMuch; + } public static bool IsThrowable(int id) { foreach(ThrowableItem itm in ThrowableItems) diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index 719ef06..d9612fe 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -281,6 +281,14 @@ namespace HISP.Game public static string LongFullLine; public static string MetaTerminator; + // Inn + public static string InnBuyMeal; + public static string InnBuyRest; + public static string InnItemEntryFormat; + public static string InnEnjoyedServiceFormat; + public static string InnFullyRested; + public static string InnCannotAffordService; + // Fountain public static string FountainMeta; public static string FountainDrankYourFull; @@ -299,7 +307,14 @@ namespace HISP.Game // Click public static string NothingInterestingHere; - + public static string FormatInnEnjoyedServiceMessage(string item, int price) + { + return InnEnjoyedServiceFormat.Replace("%ITEM%", item).Replace("%PRICE%", price.ToString("N0")); + } + public static string FormatInnItemEntry(int iconId, string itemName, int price, int itemId) + { + return InnItemEntryFormat.Replace("%ICON%", iconId.ToString()).Replace("%NAME%", itemName).Replace("%PRICE%", price.ToString("N0")).Replace("%ID%", itemId.ToString()); + } public static string FormatDroppedMoneyMessage(int amount) { return FountainDroppedMoneyFormat.Replace("%MONEY%", amount.ToString("N0")); diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs index 6ed9d78..85d7f30 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs @@ -1,4 +1,6 @@ -using HISP.Player; +using HISP.Game.Inventory; +using HISP.Game.Services; +using HISP.Player; using HISP.Server; using System; using System.Collections.Generic; @@ -227,6 +229,23 @@ namespace HISP.Game return message; } + public static string buildInn(Inn inn) + { + string message = Messages.InnBuyMeal; + foreach(Item.ItemInformation item in inn.MealsOffered) + { + message += Messages.FormatInnItemEntry(item.IconId, item.Name, inn.CalculateBuyCost(item), item.Id); + } + message += Messages.InnBuyRest; + foreach (Item.ItemInformation item in inn.RestsOffered) + { + message += Messages.FormatInnItemEntry(item.IconId, item.Name, inn.CalculateBuyCost(item), item.Id); + } + message += Messages.ExitThisPlace; + message += Messages.MetaTerminator; + return message; + } + public static string SelectPlayerStatFormat(int statValue) { int curValue = 1000; @@ -606,6 +625,14 @@ namespace HISP.Game message += buildShopInfo(shop,user.Inventory); } + + if(TileCode == "INN") + { + int InnID = int.Parse(TileArg); + Inn inn = Inn.GetInnById(InnID); + user.LastVisitedInn = inn; + message += buildInn(inn); + } if(TileCode == "FOUNTAIN") { message += buildFountain(); diff --git a/Horse Isle Server/Horse Isle Server/Game/Quest.cs b/Horse Isle Server/Horse Isle Server/Game/Quest.cs index 993b731..29a5348 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Quest.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Quest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using HISP.Game.Inventory; using HISP.Player; using HISP.Server; diff --git a/Horse Isle Server/Horse Isle Server/Game/Services/Inn.cs b/Horse Isle Server/Horse Isle Server/Game/Services/Inn.cs new file mode 100644 index 0000000..58c0414 --- /dev/null +++ b/Horse Isle Server/Horse Isle Server/Game/Services/Inn.cs @@ -0,0 +1,84 @@ +using HISP.Player; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HISP.Game.Services +{ + class Inn + { + private static List listInns = new List(); + public static Inn[] Inns + { + get + { + return listInns.ToArray(); + } + } + public int Id; + public Item.ItemInformation[] RestsOffered; + public Item.ItemInformation[] MealsOffered; + public int BuyPercentage; + public int CalculateBuyCost(Item.ItemInformation item) + { + return (int)Math.Floor((float)item.SellPrice * (100.0 / (float)BuyPercentage)); + } + + public Item.ItemInformation GetStockedItem(int itemId) + { + + // Check if inn stock.. (pun intended) + foreach(Item.ItemInformation offering in RestsOffered) + { + if (offering.Id == itemId) + return offering; + } + + foreach (Item.ItemInformation offering in MealsOffered) + { + if (offering.Id == itemId) + return offering; + } + + throw new KeyNotFoundException("Item is not stocked by this inn."); + } + + + public Inn(int id, int[] restsOffered, int[] mealsOffered, int buyPercentage) + { + Id = id; + List itemInfos = new List(); + + foreach(int itemId in restsOffered) + { + itemInfos.Add(Item.GetItemById(itemId)); + } + + RestsOffered = itemInfos.ToArray(); + itemInfos.Clear(); + + foreach (int itemId in mealsOffered) + { + itemInfos.Add(Item.GetItemById(itemId)); + } + MealsOffered = itemInfos.ToArray(); + + itemInfos.Clear(); + itemInfos = null; + + BuyPercentage = buyPercentage; + listInns.Add(this); + } + + public static Inn GetInnById(int id) + { + foreach (Inn inn in Inns) + if (inn.Id == id) + return inn; + throw new KeyNotFoundException("Inn " + id + " doesnt exist."); + + } + } +} diff --git a/Horse Isle Server/Horse Isle Server/Game/Shop.cs b/Horse Isle Server/Horse Isle Server/Game/Services/Shop.cs similarity index 95% rename from Horse Isle Server/Horse Isle Server/Game/Shop.cs rename to Horse Isle Server/Horse Isle Server/Game/Services/Shop.cs index 7abd9df..08733d0 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Shop.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Services/Shop.cs @@ -1,8 +1,9 @@ -using HISP.Server; +using HISP.Game.Inventory; +using HISP.Server; using System; using System.Collections.Generic; -namespace HISP.Game +namespace HISP.Game.Services { class Shop { diff --git a/Horse Isle Server/Horse Isle Server/Game/Transport.cs b/Horse Isle Server/Horse Isle Server/Game/Services/Transport.cs similarity index 91% rename from Horse Isle Server/Horse Isle Server/Game/Transport.cs rename to Horse Isle Server/Horse Isle Server/Game/Services/Transport.cs index fca3efd..747f22c 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Transport.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Services/Transport.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; -namespace HISP.Game +namespace HISP.Game.Services { class Transport { diff --git a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj index f7f8f3c..37c8bc1 100644 --- a/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj +++ b/Horse Isle Server/Horse Isle Server/Horse Isle Server.csproj @@ -80,7 +80,8 @@ - + + @@ -118,7 +119,7 @@ - + diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs index 0217d69..6c071e4 100644 --- a/Horse Isle Server/Horse Isle Server/Player/User.cs +++ b/Horse Isle Server/Horse Isle Server/Player/User.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using HISP.Game; using HISP.Server; using HISP.Player.Equips; +using HISP.Game.Services; +using HISP.Game.Inventory; namespace HISP.Player { @@ -39,6 +41,7 @@ namespace HISP.Player public PlayerInventory Inventory; public Npc.NpcEntry LastTalkedToNpc; public Shop LastShoppedAt; + public Inn LastVisitedInn; public PlayerQuests Quests; public Highscore Highscores; public Award Awards; diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index 988e733..47c4708 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -4,6 +4,7 @@ using Newtonsoft.Json; using HISP.Game; using HISP.Game.Chat; using HISP.Player; +using HISP.Game.Services; namespace HISP.Server { @@ -406,7 +407,37 @@ namespace HISP.Server AbuseReport.AddReason(reason); Logger.DebugPrint("Reigstered Abuse Report Reason: " + reason.Name); } - + + // Map Data + + Map.OverlayTileDepth = gameData.tile_paramaters.overlay_tiles.tile_depth.ToObject(); + + List terrainTiles = new List(); + int totalTerrainTiles = gameData.tile_paramaters.terrain_tiles.Count; + for (int i = 0; i < totalTerrainTiles; i++) + { + Map.TerrainTile tile = new Map.TerrainTile(); + tile.Passable = gameData.tile_paramaters.terrain_tiles[i].passable; + tile.Type = gameData.tile_paramaters.terrain_tiles[i].tile_type; + Logger.DebugPrint("Registered Tile: " + i + " Passable: " + tile.Passable + " Type: " + tile.Type); + terrainTiles.Add(tile); + } + Map.TerrainTiles = terrainTiles.ToArray(); + + // Register Abuse Report Reasons + + int totalInns = gameData.inns.Count; + for (int i = 0; i < totalInns; i++) + { + int id = gameData.inns[i].id; + int[] restsOffered = gameData.inns[i].rests_offered.ToObject(); + int[] mealsOffered = gameData.inns[i].meals_offered.ToObject(); + int buyPercent = gameData.inns[i].buy_percent; + Inn inn = new Inn(id, restsOffered, mealsOffered, buyPercent); + + Logger.DebugPrint("Reigstered Inn: " + inn.Id + " Buying at: " + inn.BuyPercentage.ToString() + "%!"); + } + Item.Present = gameData.item.special.present; Item.MailMessage = gameData.item.special.mail_message; Item.DorothyShoes = gameData.item.special.dorothy_shoes; @@ -632,6 +663,14 @@ namespace HISP.Server Messages.NoPitchforkMeta = gameData.messages.meta.hay_pile.no_pitchfork; Messages.HasPitchforkMeta = gameData.messages.meta.hay_pile.pitchfork; + // Inn + Messages.InnBuyMeal = gameData.messages.meta.inn.buy_meal; + Messages.InnBuyRest = gameData.messages.meta.inn.buy_rest; + Messages.InnItemEntryFormat = gameData.messages.meta.inn.inn_entry; + Messages.InnEnjoyedServiceFormat = gameData.messages.inn.enjoyed_service; + Messages.InnCannotAffordService = gameData.messages.inn.cant_afford; + Messages.InnFullyRested = gameData.messages.inn.fully_rested; + // Fountain Messages.FountainMeta = gameData.messages.meta.fountain; Messages.FountainDrankYourFull = gameData.messages.fountain.drank_your_fill; @@ -693,22 +732,6 @@ namespace HISP.Server Messages.NpcInformationButton = gameData.messages.meta.npc.npc_information_button; Messages.NpcInformationFormat = gameData.messages.meta.npc.npc_information_format; - // Map Data - - Map.OverlayTileDepth = gameData.tile_paramaters.overlay_tiles.tile_depth.ToObject(); - - List terrainTiles = new List(); - int totalTerrainTiles = gameData.tile_paramaters.terrain_tiles.Count; - for(int i = 0; i < totalTerrainTiles; i++) - { - Map.TerrainTile tile = new Map.TerrainTile(); - tile.Passable = gameData.tile_paramaters.terrain_tiles[i].passable; - tile.Type = gameData.tile_paramaters.terrain_tiles[i].tile_type; - Logger.DebugPrint("Registered Tile: " + i + " Passable: " + tile.Passable + " Type: " + tile.Type); - terrainTiles.Add(tile); - } - Map.TerrainTiles = terrainTiles.ToArray(); - // Disconnect Reasons Messages.KickReasonBanned = gameData.messages.disconnect.banned; @@ -744,6 +767,7 @@ namespace HISP.Server Messages.BoatCutscene = gameData.transport.boat_cutscene; Messages.BallonCutscene = gameData.transport.ballon_cutscene; + gameData = null; } } diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index afc32f9..27e26a8 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -11,6 +11,8 @@ using HISP.Security; using HISP.Game.Chat; using HISP.Player.Equips; using System.Drawing; +using HISP.Game.Services; +using HISP.Game.Inventory; namespace HISP.Server { @@ -1500,35 +1502,7 @@ namespace HISP.Server ItemInstance instance = itm.ItemInstances[0]; sender.LoggedinUser.Inventory.Remove(instance); Item.ItemInformation itmInfo = instance.GetItemInfo(); - bool toMuch = false; - foreach(Item.Effects effect in itmInfo.Effects) - { - switch(effect.EffectsWhat) - { - case "TIREDNESS": - if (sender.LoggedinUser.Tiredness + effect.EffectAmount > 1000) - toMuch = true; - sender.LoggedinUser.Tiredness += effect.EffectAmount; - break; - case "THIRST": - if (sender.LoggedinUser.Thirst + effect.EffectAmount > 1000) - toMuch = true; - sender.LoggedinUser.Thirst += effect.EffectAmount; - break; - case "HUNGER": - if (sender.LoggedinUser.Hunger + effect.EffectAmount > 1000) - toMuch = true; - sender.LoggedinUser.Hunger += effect.EffectAmount; - break; - case "NOEFFECT": - break; - default: - Logger.ErrorPrint("Unknown effect: " + effect.EffectsWhat); - break; - - } - } - + bool toMuch = Item.ConsumeItem(sender.LoggedinUser, itmInfo); byte[] chatPacket = PacketBuilder.CreateChat(Messages.FormatConsumeItemMessaege(itmInfo.Name), PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(chatPacket); @@ -1537,6 +1511,7 @@ namespace HISP.Server chatPacket = PacketBuilder.CreateChat(Messages.ConsumedButMaxReached, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(chatPacket); } + UpdateInventory(sender); } else @@ -1704,6 +1679,73 @@ namespace HISP.Server } break; + case PacketBuilder.ITEM_BUY_AND_CONSUME: + packetStr = Encoding.UTF8.GetString(packet); + itemIdStr = packetStr.Substring(2, packet.Length - 3); + itemId = 0; + // Prevent crashing on non-int string. + try + { + itemId = Int32.Parse(itemIdStr); + } + catch (FormatException) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid object buy and consume packet."); + return; + } + if (!Item.ItemIdExist(itemId)) + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an itemid that doesnt even exist."); + break; + } + + Inn lastInn = sender.LoggedinUser.LastVisitedInn; + if (lastInn != null) + { + try + { + itemInfo = lastInn.GetStockedItem(itemId); + int price = lastInn.CalculateBuyCost(itemInfo); + if(sender.LoggedinUser.Money >= price) + { + sender.LoggedinUser.Money -= price; + bool toMuch = Item.ConsumeItem(sender.LoggedinUser, itemInfo); + + string tooMuchMessage = Messages.ConsumedButMaxReached; + if (itemInfo.Effects.Length > 0) + if (itemInfo.Effects[0].EffectsWhat == "TIREDNESS") + tooMuchMessage = Messages.InnFullyRested; + if (itemInfo.Effects.Length > 1) + if (itemInfo.Effects[1].EffectsWhat == "TIREDNESS") + tooMuchMessage = Messages.InnFullyRested; + + byte[] enjoyedServiceMessage = PacketBuilder.CreateChat(Messages.FormatInnEnjoyedServiceMessage(itemInfo.Name, price), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(enjoyedServiceMessage); + + if(toMuch) + { + byte[] toMuchMessage = PacketBuilder.CreateChat(tooMuchMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(toMuchMessage); + } + + Update(sender); + } + else + { + byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.InnCannotAffordService, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(cantAffordMessage); + } + } + catch(KeyNotFoundException) + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy and consume an item not stocked by the inn there standing on."); + } + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy and consume item while not in a inn."); + } + break; case PacketBuilder.ITEM_BUY: // Handles buying an item. message = 1; @@ -1718,7 +1760,7 @@ namespace HISP.Server count = 25; doPurchase:; packetStr = Encoding.UTF8.GetString(packet); - itemIdStr = packetStr.Substring(2, packet.Length - 2); + itemIdStr = packetStr.Substring(2, packet.Length - 3); itemId = 0; // Prevent crashing on non-int string. try @@ -1731,6 +1773,12 @@ namespace HISP.Server return; } + if(!Item.ItemIdExist(itemId)) + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to buy an itemid that doesnt even exist."); + break; + } + itemInfo = Item.GetItemById(itemId); shop = sender.LoggedinUser.LastShoppedAt; if (shop != null) diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index 9bb47eb..aabd415 100644 --- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs @@ -84,6 +84,7 @@ namespace HISP.Server public const byte ITEM_PICKUP = 0x14; public const byte ITEM_PICKUP_ALL = 0x15; public const byte ITEM_BUY = 0x33; + public const byte ITEM_BUY_AND_CONSUME = 0x34; public const byte ITEM_BUY_5 = 0x35; public const byte ITEM_BUY_25 = 0x37; public const byte ITEM_SELL = 0x3C;