From 62a2e64ea51fde6c8606c5fb14c5677987423461 Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Sat, 13 Feb 2021 13:05:34 +1300 Subject: [PATCH] Add Groomers --- DataCollection/gamedata.json | 7 +- .../HorseIsleServer/Game/Messages.cs | 7 +- .../HorseIsleServer/Game/Meta.cs | 27 +++++ .../HorseIsleServer/Server/GameDataJson.cs | 6 +- .../HorseIsleServer/Server/GameServer.cs | 109 ++++++++++++++++++ .../HorseIsleServer/Server/PacketBuilder.cs | 2 + 6 files changed, 153 insertions(+), 5 deletions(-) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 218a26c..5ea638b 100755 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -232,11 +232,14 @@ "not_subscribed_load":"Cannot load drawings when you are not a subscriber.", }, "groomer":{ - "groomed_best_it_can":"Your horse %HORSEBREED% is now groomed as best as this groomer can!", + "groomed_best_it_can":"Your horse %HORSENAME% is now groomed as best as this groomer can!", "cannot_afford_service":"You cannot afford the groomer's services at this time.", + "groomed_best_all":"Your horses are now all groomed as best as this groomer can!", + "dont_need":"Your horses do not require any grooming services right now.", + "currently_at":"^LYour horse %HORSENAME%: groom currently %TOTAL%/%MAX%^R1", "apply_service":"^I258^T8Apply grooming services for $%PRICE% ^B3G%RANDOMID%^R1", - "apply_all":"^R1^R1^I258^T8Groom all %COUNT% horses for $%PRICE% ^B3g^R1", + "apply_all":"^R1^I258^T8Groom all %COUNT% horses for $%PRICE% ^B3g^R1", "cannot_improve":"^I258^T9This groomer cannot improve this horse's groom.^R1", }, "farrier":{ diff --git a/Horse Isle Server/HorseIsleServer/Game/Messages.cs b/Horse Isle Server/HorseIsleServer/Game/Messages.cs index 1f274ab..6ae9aa9 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Messages.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Messages.cs @@ -439,6 +439,9 @@ namespace HISP.Game public static string GroomerBestToHisAbilitiesFormat; public static string GroomerCannotAffordMessage; + public static string GroomerBestToHisAbilitiesALL; + public static string GroomerDontNeed; + public static string GroomerHorseCurrentlyAtFormat; public static string GroomerApplyServiceFormat; public static string GroomerApplyServiceForAllFormat; @@ -872,9 +875,9 @@ namespace HISP.Game { return GroomerHorseCurrentlyAtFormat.Replace("%HORSENAME%", horseName).Replace("%TOTAL%", currentGroom.ToString()).Replace("%MAX%", maxGroom.ToString()); } - public static string FormatHorseGroomedToBestAbilities(string breedName) + public static string FormatHorseGroomedToBestAbilities(string horseName) { - return GroomerBestToHisAbilitiesFormat.Replace("%HORSEBREED%", breedName); + return GroomerBestToHisAbilitiesFormat.Replace("%HORSENAME%", horseName); } public static string FormatBookReadMeta(string author, string title, string bookText) diff --git a/Horse Isle Server/HorseIsleServer/Game/Meta.cs b/Horse Isle Server/HorseIsleServer/Game/Meta.cs index 40aa606..97254b8 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Meta.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Meta.cs @@ -1313,6 +1313,27 @@ namespace HISP.Game message += Messages.MetaTerminator; return message; } + private static string buildGroomer(User User, Groomer groomer) + { + string message = ""; + int totalPrice = 0; + int count = 0; + foreach(HorseInstance horse in User.HorseInventory.HorseList) + { + message += Messages.FormatHorseGroomCurrentlyAt(horse.Name, horse.BasicStats.Groom, 1000); + if(horse.BasicStats.Groom < groomer.Max) + { + int price = groomer.CalculatePrice(horse.BasicStats.Groom); + totalPrice += price; + count++; + message += Messages.FormatGroomerApplyService(price, horse.RandomId); + } + } + message += Messages.FormatGroomerApplyAllService(count, totalPrice); + message += Messages.ExitThisPlace; + message += Messages.MetaTerminator; + return message; + } private static string buildVet(Vet vet, User user) { string message = ""; @@ -1893,6 +1914,12 @@ namespace HISP.Game Vet vet = Vet.GetVetById(VetId); message += buildVet(vet, user); } + if(TileCode == "GROOMER") + { + int groomId = int.Parse(TileArg); + Groomer groomer = Groomer.GetGroomerById(groomId); + message += buildGroomer(user, groomer); + } if (TileCode == "BANK") { message += buildBank(user); diff --git a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs index be38836..a19a0c5 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs @@ -848,10 +848,14 @@ namespace HISP.Server // Groomer Messages.GroomerBestToHisAbilitiesFormat = gameData.messages.meta.groomer.groomed_best_it_can; Messages.GroomerCannotAffordMessage = gameData.messages.meta.groomer.cannot_afford_service; + Messages.GroomerCannotImprove = gameData.messages.meta.groomer.cannot_improve; + Messages.GroomerBestToHisAbilitiesALL = gameData.messages.meta.groomer.groomed_best_all; + Messages.GroomerDontNeed = gameData.messages.meta.groomer.dont_need; + + Messages.GroomerHorseCurrentlyAtFormat = gameData.messages.meta.groomer.currently_at; Messages.GroomerApplyServiceFormat = gameData.messages.meta.groomer.apply_service; 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; diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs index f82af2b..cdde63c 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs @@ -310,6 +310,7 @@ namespace HISP.Server { byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.VetCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(cantAffordMessage); + break; } UpdateArea(sender); } @@ -382,6 +383,7 @@ namespace HISP.Server { byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.FarrierShoesCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(cantAffordMessage); + break; } UpdateArea(sender); } @@ -431,6 +433,113 @@ namespace HISP.Server { byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.FarrierShoesCantAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(cantAffordMessage); + break; + } + UpdateArea(sender); + } + } + break; + case PacketBuilder.HORSE_GROOM_SERVICE: + 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 groomHorseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId); + sender.LoggedinUser.LastViewedHorse = groomHorseInst; + + if (World.InSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y)) + { + World.SpecialTile tile = World.GetSpecialTile(sender.LoggedinUser.X, sender.LoggedinUser.Y); + if (tile.Code.StartsWith("GROOMER-")) + { + string[] groomerInfo = tile.Code.Split('-'); + int groomerId = int.Parse(groomerInfo[1]); + + Groomer groomer = Groomer.GetGroomerById(groomerId); + int price = groomer.CalculatePrice(groomHorseInst.BasicStats.Groom); + + + if (sender.LoggedinUser.Money >= price) + { + groomHorseInst.BasicStats.Groom = groomer.Max; + sender.LoggedinUser.Money -= price; + + byte[] messagePacket = PacketBuilder.CreateChat(Messages.FormatHorseGroomedToBestAbilities(groomHorseInst.Name), PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(messagePacket); + } + else + { + byte[] cantAffordMessage = PacketBuilder.CreateChat(Messages.GroomerCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(cantAffordMessage); + break; + } + UpdateArea(sender); + } + } + break; + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to use groomer services on a non existant horse."); + break; + } + case PacketBuilder.HORSE_GROOM_SERVICE_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("GROOMER-")) + { + string[] groomerInfo = tile.Code.Split('-'); + int groomId = int.Parse(groomerInfo[1]); + Groomer groomer = Groomer.GetGroomerById(groomId); + int price = 0; + int count = 0; + + foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList) + { + if(horse.BasicStats.Groom < groomer.Max) + { + price += groomer.CalculatePrice(horse.BasicStats.Groom); + count++; + } + } + if (count == 0) + { + byte[] notNeededMessagePacket = PacketBuilder.CreateChat(Messages.GroomerDontNeed, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(notNeededMessagePacket); + break; + } + else if (sender.LoggedinUser.Money >= price) + { + foreach (HorseInstance horse in sender.LoggedinUser.HorseInventory.HorseList) + if (horse.BasicStats.Groom < groomer.Max) + horse.BasicStats.Groom = groomer.Max; + + byte[] groomedAllHorsesPacket = PacketBuilder.CreateChat(Messages.GroomerBestToHisAbilitiesALL, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(groomedAllHorsesPacket); + + sender.LoggedinUser.Money -= price; + + } + else + { + byte[] cannotAffordMessagePacket = PacketBuilder.CreateChat(Messages.GroomerCannotAffordMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(cannotAffordMessagePacket); + break; } UpdateArea(sender); } diff --git a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs index f377a38..b8571f8 100755 --- a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs +++ b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs @@ -72,6 +72,8 @@ namespace HISP.Server public const byte HORSE_TACK_UNEQUIP = 0x3D; public const byte HORSE_VET_SERVICE = 0x2A; public const byte HORSE_VET_SERVICE_ALL = 0x2F; + public const byte HORSE_GROOM_SERVICE_ALL = 0x33; + public const byte HORSE_GROOM_SERVICE = 0x32; public const byte HORSE_MOUNT = 0x46; public const byte HORSE_SHOE_IRON = 0x28; public const byte HORSE_SHOE_STEEL = 0x29;