From f20e67bfd69d750f0672de7777a46d604ebbaf90 Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Fri, 12 Feb 2021 16:24:40 +1300 Subject: [PATCH] Implement farrier --- DataCollection/gamedata.json | 3 +- .../HorseIsleServer/Game/Messages.cs | 39 ++- .../HorseIsleServer/Game/Meta.cs | 295 ++++++++++-------- .../HorseIsleServer/Server/GameDataJson.cs | 31 ++ .../HorseIsleServer/Server/GameServer.cs | 115 +++++++ .../HorseIsleServer/Server/PacketBuilder.cs | 3 + 6 files changed, 351 insertions(+), 135 deletions(-) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 4332ece..161d5ad 100755 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -242,6 +242,7 @@ "current_shoes":"^LYour horse %HORSENAME%: shoes currently %TOTAL%/%MAX%^R1", "apply_iron":"^I255^T6Apply Iron Shoe for $%PRICE% (%INCBY%)^B3JI%HORSERANDOMID%^R1", "apply_steel":"^I256^T6Apply Steel Shoe for $%PRICE% (%INCBY%)^B3JS%HORSERANDOMID%^R1", + "shoe_all":"^R1^I256^T6Apply Steel Shoe for $%PRICE% (%INCBY%)^B3j00^R1", "put_on_steel_shoes":"Your horse has had new Steel Horseshoes put on. Now shoes=%TOTAL%/%MAX%.", "put_on_iron_shoes":"Your horse has had new Iron Horseshoes put on. Now shoes=%TOTAL%/%MAX%.", @@ -905,7 +906,7 @@ }, "farrier":{ "price_multipliers":[ - {"id":1,"steel":1000,"steelcost":500,"iron":750, "ironcost":100} + {"id":1,"steel":1000,"steel_cost":500,"iron":750, "iron_cost":100} ] } }, diff --git a/Horse Isle Server/HorseIsleServer/Game/Messages.cs b/Horse Isle Server/HorseIsleServer/Game/Messages.cs index 2663333..b3d4cdd 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Messages.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Messages.cs @@ -425,11 +425,12 @@ namespace HISP.Game public static string FarrierCurrentShoesFormat; public static string FarrierApplyIronShoesFormat; public static string FarrierApplySteelShoesFormat; - + public static string FarrierShoeAllFormat; public static string FarrierPutOnSteelShoesMessageFormat; public static string FarrierPutOnIronShoesMessageFormat; - public static string FarrierPutOnSteelShoesAllMessageFormat; + public static string FarrierPutOnSteelShoesAllMesssageFormat; + public static string FarrierShoesCantAffordMessage; // Groomer @@ -680,6 +681,40 @@ namespace HISP.Game // Click public static string NothingInterestingHere; + + // Farrier Formats + public static string FormatFarrierPutOnSteelShoesAllMesssage(int curShoes, int maxShoes) + { + return FarrierPutOnSteelShoesAllMesssageFormat.Replace("%TOTAL%", curShoes.ToString()).Replace("%MAX%", maxShoes.ToString()); + } + public static string FormatFarrierPutOnIronShoesMessage(int curShoes, int maxShoes) + { + return FarrierPutOnIronShoesMessageFormat.Replace("%TOTAL%", curShoes.ToString()).Replace("%MAX%", maxShoes.ToString()); + } + public static string FormatFarrierPutOnSteelShoesMessage(int curShoes, int maxShoes) + { + return FarrierPutOnSteelShoesMessageFormat.Replace("%TOTAL%", curShoes.ToString()).Replace("%MAX%", maxShoes.ToString()); + } + public static string FormatFarrierApplySteelToAll(int price, int incBy) + { + return FarrierShoeAllFormat.Replace("%PRICE%", price.ToString("N0")).Replace("%INCBY%", incBy.ToString()); + } + public static string FormatFarrierApplySteel(int price, int incBy, int horseRandomid) + { + return FarrierApplySteelShoesFormat.Replace("%PRICE%", price.ToString("N0")).Replace("%INCBY%", incBy.ToString()).Replace("%HORSERANDOMID%", horseRandomid.ToString()); + } + public static string FormatFarrierApplyIron(int price, int incBy, int horseRandomid) + { + return FarrierApplyIronShoesFormat.Replace("%PRICE%", price.ToString("N0")).Replace("%INCBY%", incBy.ToString()).Replace("%HORSERANDOMID%", horseRandomid.ToString()); + } + public static string FormatFarrierCurrentShoes(string horseName, int curShoes, int maxShoes) + { + return FarrierCurrentShoesFormat.Replace("%HORSENAME%", horseName).Replace("%TOTAL%", curShoes.ToString()).Replace("%MAX%", maxShoes.ToString()); + } + + + // Ranch Formats + public static string FormatRanchTrainFail(string horseName, int timeout) { return RanchTrainCantTrain.Replace("%HORSENAME%", horseName).Replace("%TIME%", timeout.ToString()); diff --git a/Horse Isle Server/HorseIsleServer/Game/Meta.cs b/Horse Isle Server/HorseIsleServer/Game/Meta.cs index eaac887..6362427 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Meta.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Meta.cs @@ -1330,6 +1330,30 @@ namespace HISP.Game message += Messages.MetaTerminator; return message; } + private static string buildFarrier(User user, Farrier farrier) + { + string message = ""; + int totalPrice = 0; + int maxShoes = 1000; + foreach (HorseInstance horse in user.HorseInventory.HorseList) + { + message += Messages.FormatFarrierCurrentShoes(horse.Name, horse.BasicStats.Shoes, maxShoes); + if (horse.BasicStats.Shoes < farrier.IronShoesAmount) + message += Messages.FormatFarrierApplyIron(farrier.IronCost, farrier.IronShoesAmount, horse.RandomId); + + if (horse.BasicStats.Shoes < farrier.SteelShoesAmount) + { + totalPrice += farrier.SteelCost; + message += Messages.FormatFarrierApplySteel(farrier.SteelCost, farrier.SteelShoesAmount, horse.RandomId); + } + + } + if(totalPrice > 0) + message += Messages.FormatFarrierApplySteelToAll(totalPrice, farrier.SteelShoesAmount); + message += Messages.ExitThisPlace; + message += Messages.MetaTerminator; + return message; + } private static string buildRiddlerRiddle(User user) { Riddler riddle = Riddler.GetRandomRiddle(user); @@ -1341,138 +1365,7 @@ namespace HISP.Game return message; } - public static string BuildSpecialTileInfo(User user, World.SpecialTile specialTile) - { - string message = ""; - - if (specialTile.Code == null) - message += buildLocationString(specialTile.X, specialTile.Y); - - - if (specialTile.Title != null && specialTile.Title != "") - message += Messages.FormatTileName(specialTile.Title); - - - if (specialTile.Description != null && specialTile.Description != "") - message += specialTile.Description; - - string npc = buildNpc(user, specialTile.X, specialTile.Y); - message += npc; - - if (specialTile.Code == null || specialTile.Code == "") - message += buildCommonInfo(specialTile.X, specialTile.Y); - else - { - - user.MetaPriority = true; - - string TileCode = specialTile.Code; - - string TileArg = ""; - if (TileCode.Contains("-")) - { - TileArg = TileCode.Split('-')[1]; - TileCode = TileCode.Split('-')[0]; - } - if (TileCode == "EXITABLE") - message += Messages.ExitThisPlace; - - if (TileCode == "TRANSPORT") - { - Transport.TransportPoint point = Transport.GetTransportPoint(specialTile.X, specialTile.Y); - message += Meta.BuildTransportInfo(user, point); - } - - if (TileCode == "STRAWPILE") - { - if (user.Inventory.HasItemId(Item.Pitchfork)) - message += Messages.HasPitchforkMeta; - else - message += Messages.NoPitchforkMeta; - } - - if (TileCode == "STORE") - { - int ShopID = int.Parse(TileArg); - Shop shop = Shop.GetShopById(ShopID); - user.LastShoppedAt = shop; - message += buildShopInfo(shop,user.Inventory); - - } - if(TileCode == "VET") - { - int VetId = int.Parse(TileArg); - Vet vet = Vet.GetVetById(VetId); - message += buildVet(vet, user); - } - if(TileCode == "BANK") - { - message += buildBank(user); - } - if(TileCode == "WISHINGWELL") - { - message += buildWishingWell(user); - } - if(TileCode == "VENUSFLYTRAP") - { - message += buildVenusFlyTrap(user); - } - if(TileCode == "RIDDLER") - { - message += buildRiddlerRiddle(user); - } - if(TileCode == "LIBRARY") - { - message += buildLibary(); - } - if(TileCode == "POND") - { - message += buildPond(user); - } - if(TileCode == "WORKSHOP") - { - message += buildWorkshop(user); - } - if(TileCode == "MUDHOLE") - { - message += buildMudHole(user); - } - if(TileCode == "RANCH") - { - message += buildRanch(user, int.Parse(TileArg)); - } - if(TileCode == "MULTIROOM") - { - user.MetaPriority = false; // acturally want to track updates here >-< - if(TileArg != "") - message += buildMultiroom(TileArg, user); - } - if(TileCode == "PASSWORD") - { - message += buildPassword(); - } - if(TileCode == "HORSEWHISPERER") - { - message += buildHorseWhisperer(); - } - if(TileCode == "INN") - { - int InnID = int.Parse(TileArg); - Inn inn = Inn.GetInnById(InnID); - user.LastVisitedInn = inn; - message += buildInn(inn); - } - if(TileCode == "FOUNTAIN") - { - message += buildFountain(); - - } - } - - - - return message; - } + public static string BuildHorseEscapedMessage() { string message = Messages.HorseEvadedCapture; @@ -1846,6 +1739,7 @@ namespace HISP.Game return message; } + public static string BuildTackMenu(HorseInstance horse, User user) { string message = Messages.FormatTackedAsFollowedMessage(horse.Name); @@ -1928,6 +1822,143 @@ namespace HISP.Game message += buildCommonInfo(x, y); return message; } + public static string BuildSpecialTileInfo(User user, World.SpecialTile specialTile) + { + string message = ""; + + if (specialTile.Code == null) + message += buildLocationString(specialTile.X, specialTile.Y); + + + if (specialTile.Title != null && specialTile.Title != "") + message += Messages.FormatTileName(specialTile.Title); + + + if (specialTile.Description != null && specialTile.Description != "") + message += specialTile.Description; + + string npc = buildNpc(user, specialTile.X, specialTile.Y); + message += npc; + + if (specialTile.Code == null || specialTile.Code == "") + message += buildCommonInfo(specialTile.X, specialTile.Y); + else + { + + user.MetaPriority = true; + + string TileCode = specialTile.Code; + + string TileArg = ""; + if (TileCode.Contains("-")) + { + TileArg = TileCode.Split('-')[1]; + TileCode = TileCode.Split('-')[0]; + } + if (TileCode == "EXITABLE") + message += Messages.ExitThisPlace; + + if (TileCode == "TRANSPORT") + { + Transport.TransportPoint point = Transport.GetTransportPoint(specialTile.X, specialTile.Y); + message += Meta.BuildTransportInfo(user, point); + } + + if (TileCode == "STRAWPILE") + { + if (user.Inventory.HasItemId(Item.Pitchfork)) + message += Messages.HasPitchforkMeta; + else + message += Messages.NoPitchforkMeta; + } + + if (TileCode == "STORE") + { + int ShopID = int.Parse(TileArg); + Shop shop = Shop.GetShopById(ShopID); + user.LastShoppedAt = shop; + message += buildShopInfo(shop, user.Inventory); + + } + if (TileCode == "VET") + { + int VetId = int.Parse(TileArg); + Vet vet = Vet.GetVetById(VetId); + message += buildVet(vet, user); + } + if (TileCode == "BANK") + { + message += buildBank(user); + } + if (TileCode == "WISHINGWELL") + { + message += buildWishingWell(user); + } + if (TileCode == "VENUSFLYTRAP") + { + message += buildVenusFlyTrap(user); + } + if (TileCode == "RIDDLER") + { + message += buildRiddlerRiddle(user); + } + if (TileCode == "LIBRARY") + { + message += buildLibary(); + } + if (TileCode == "POND") + { + message += buildPond(user); + } + if (TileCode == "WORKSHOP") + { + message += buildWorkshop(user); + } + if (TileCode == "MUDHOLE") + { + message += buildMudHole(user); + } + if (TileCode == "RANCH") + { + message += buildRanch(user, int.Parse(TileArg)); + } + if(TileCode == "FARRIER") + { + message += buildFarrier(user, Farrier.GetFarrierById(int.Parse(TileArg))); + } + if (TileCode == "MULTIROOM") + { + user.MetaPriority = false; // acturally want to track updates here >-< + if (TileArg != "") + message += buildMultiroom(TileArg, user); + } + if (TileCode == "PASSWORD") + { + message += buildPassword(); + } + if (TileCode == "HORSEWHISPERER") + { + message += buildHorseWhisperer(); + } + if (TileCode == "INN") + { + int InnID = int.Parse(TileArg); + Inn inn = Inn.GetInnById(InnID); + user.LastVisitedInn = inn; + message += buildInn(inn); + } + if (TileCode == "FOUNTAIN") + { + message += buildFountain(); + + } + } + + + + return message; + } + } } diff --git a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs index d027ee3..c716b21 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs @@ -520,6 +520,8 @@ namespace HISP.Server Tracking.TrackedItemsStatsMenu.Add(trackedItem); Logger.DebugPrint("Registered Tracked Item: " + trackedItem.What + " value: " + trackedItem.Value); } + // Register Services + int totalVets = gameData.services.vet.price_multipliers.Count; for (int i = 0; i < totalVets; i++) { @@ -537,6 +539,22 @@ namespace HISP.Server Groomer groomer = new Groomer(id, cost, max); Logger.DebugPrint("Registered Groomer: " + groomer.Id + " selling at: " + groomer.PriceMultiplier.ToString(CultureInfo.InvariantCulture)); } + + int totalFarriers = gameData.services.farrier.price_multipliers.Count; + for (int i = 0; i < totalFarriers; i++) + { + int id = gameData.services.farrier.price_multipliers[i].id; + int steel = gameData.services.farrier.price_multipliers[i].steel; + int steelcost = gameData.services.farrier.price_multipliers[i].steel_cost; + int iron = gameData.services.farrier.price_multipliers[i].iron; + int ironcost = gameData.services.farrier.price_multipliers[i].iron_cost; + + Farrier farrier = new Farrier(id, steel, steelcost, iron, ironcost); + Logger.DebugPrint("Registered Farrier: " + farrier.Id); + } + + + // Register Libary Books int totalBooks = gameData.books.Count; for (int i = 0; i < totalBooks; i++) { @@ -548,6 +566,8 @@ namespace HISP.Server Logger.DebugPrint("Registered Libary Book: " + book.Id + " " + book.Title + " by " + book.Author); } + + // Register Crafts int totalWorkshops = gameData.workshop.Count; for (int i = 0; i < totalWorkshops; i++) { @@ -830,6 +850,17 @@ namespace HISP.Server Messages.GroomerApplyServiceForAllFormat = gameData.messages.meta.groomer.apply_all; Messages.GroomerCannotImprove = gameData.messages.meta.groomer.cannot_improve; + // Farrier + Messages.FarrierCurrentShoesFormat = gameData.messages.meta.farrier.current_shoes; + Messages.FarrierApplyIronShoesFormat = gameData.messages.meta.farrier.apply_iron; + Messages.FarrierApplySteelShoesFormat = gameData.messages.meta.farrier.apply_steel; + Messages.FarrierShoeAllFormat = gameData.messages.meta.farrier.shoe_all; + + Messages.FarrierPutOnSteelShoesMessageFormat = gameData.messages.meta.farrier.put_on_steel_shoes; + Messages.FarrierPutOnIronShoesMessageFormat = gameData.messages.meta.farrier.put_on_iron_shoes; + Messages.FarrierPutOnSteelShoesAllMesssageFormat = gameData.messages.meta.farrier.put_on_steel_all; + Messages.FarrierShoesCantAffordMessage = gameData.messages.meta.farrier.cant_afford_farrier; + // Vet Messages.VetServiceHorseFormat = gameData.messages.meta.vet.service_horse; Messages.VetSerivcesNotNeeded = gameData.messages.meta.vet.not_needed; diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs index 281078f..78ac5d2 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs @@ -320,6 +320,121 @@ namespace HISP.Server Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use vet services on a non existant horse."); break; } + case PacketBuilder.HORSE_SHOE_STEEL: + case PacketBuilder.HORSE_SHOE_IRON: + randomId = 0; + packetStr = Encoding.UTF8.GetString(packet); + randomIdStr = packetStr.Substring(2, packetStr.Length - 4); + + if (randomIdStr == "NaN") + break; + + try + { + randomId = int.Parse(randomIdStr); + } + catch (Exception) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid randomid to horse interaction packet "); + break; + } + if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId)) + { + HorseInstance horseFarrierServiceInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId); + sender.LoggedinUser.LastViewedHorse = horseFarrierServiceInst; + + if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y)) + { + World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y); + if (tile.Code.StartsWith("FARRIER-")) + { + string[] farrierInfo = tile.Code.Split('-'); + int farrierId = int.Parse(farrierInfo[1]); + + Farrier farrier = Farrier.GetFarrierById(farrierId); + int price = 0; + int incAmount = 0; + string msg = ""; + + if(method == PacketBuilder.HORSE_SHOE_STEEL) + { + price = farrier.SteelCost; + incAmount = farrier.SteelShoesAmount; + msg = Messages.FormatFarrierPutOnSteelShoesMessage(incAmount, 1000); + } + else + { + price = farrier.IronCost; + incAmount = farrier.IronShoesAmount; + msg = Messages.FormatFarrierPutOnIronShoesMessage(incAmount, 1000); + } + + if (sender.LoggedinUser.Money >= price) + { + horseFarrierServiceInst.BasicStats.Shoes = incAmount; + sender.LoggedinUser.Money -= price; + + byte[] messagePacket = PacketBuilder.CreateChat(msg, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(messagePacket); + } + else + { + byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.FarrierShoesCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(cantAffordMessage); + } + UpdateArea(sender); + } + } + break; + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use farrier services on a non existant horse."); + break; + } + case PacketBuilder.HORSE_SHOE_ALL: + if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y)) + { + World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y); + if (tile.Code.StartsWith("FARRIER-")) + { + string[] farrierInfo = tile.Code.Split('-'); + int farrierId = int.Parse(farrierInfo[1]); + + Farrier farrier = Farrier.GetFarrierById(farrierId); + + int totalPrice = 0; + foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList) + { + if (horse.BasicStats.Shoes < farrier.SteelShoesAmount) + { + totalPrice += farrier.SteelCost; + } + } + + if (sender.LoggedinUser.Money >= totalPrice) + { + foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList) + { + if (horse.BasicStats.Shoes < farrier.SteelShoesAmount) + { + horse.BasicStats.Shoes = farrier.SteelShoesAmount; + } + } + sender.LoggedinUser.Money -= totalPrice; + + byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatFarrierPutOnSteelShoesAllMesssage(farrier.SteelShoesAmount, 1000), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(messagePacket); + } + else + { + byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.FarrierShoesCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(cantAffordMessage); + } + UpdateArea(sender); + } + } + break; case PacketBuilder.HORSE_GIVE_FEED: randomId = 0; packetStr = Encoding.UTF8.GetString(packet); diff --git a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs index 37179ec..f377a38 100755 --- a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs +++ b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs @@ -73,6 +73,9 @@ namespace HISP.Server public const byte HORSE_VET_SERVICE = 0x2A; public const byte HORSE_VET_SERVICE_ALL = 0x2F; public const byte HORSE_MOUNT = 0x46; + public const byte HORSE_SHOE_IRON = 0x28; + public const byte HORSE_SHOE_STEEL = 0x29; + public const byte HORSE_SHOE_ALL = 0x2E; public const byte HORSE_DISMOUNT = 0x47; public const byte HORSE_ESCAPE = 0x1E; public const byte HORSE_CAUGHT = 0x1D;