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;