From 6f1da9df59fd030a8ca7b118e4c4c3b618a1910c Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Thu, 14 Jan 2021 18:57:06 +1300 Subject: [PATCH] Implement release horse button --- DataCollection/gamedata.json | 3 + .../Game/Inventory/HorseInventory.cs | 6 ++ .../Horse Isle Server/Game/Messages.cs | 13 ++++ .../Horse Isle Server/Game/Meta.cs | 19 ++++- .../Horse Isle Server/Player/User.cs | 1 + .../Horse Isle Server/Server/Database.cs | 13 ++++ .../Horse Isle Server/Server/GameDataJson.cs | 5 ++ .../Horse Isle Server/Server/GameServer.cs | 69 ++++++++++++++++++- .../Horse Isle Server/Server/PacketBuilder.cs | 1 + 9 files changed, 128 insertions(+), 2 deletions(-) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index c4290ad..ca676d8 100644 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -158,6 +158,9 @@ "pet_horse_too_happy":"Your horse is as happy as it can be now. Your horse whinnies lightly. (+%MOOD% mood / -%TIREDNESS% tiredness)", "description_edit":"^PLHorse's Name:|%HORSENAME%^D11|GENERATE RANDOM HORSE NAME^R1^LDescription: (reset if you generate name)^R1^PB120|%DESCRIPTION%^PS5|SAVE CHANGES", "tack_fail_autosell":"You cannot put tack on a horse with Auto-Sell set.", + "horse_release":"Are you SURE you want to let the horse go?^T2If so, click ^B3X%RANDOMID%^R6", + "cant_release_currently_riding":"You cannot release the horse you are riding!", + "released_horse":"You released the horse! It now roams Horse Isle freely. It will disappear in an hour.", "companion_menu":{ "menu_header":"%HORSENAME%'s current companion:
", "companions_avalible":"^LYou have the following companions available:^R1", diff --git a/Horse Isle Server/Horse Isle Server/Game/Inventory/HorseInventory.cs b/Horse Isle Server/Horse Isle Server/Game/Inventory/HorseInventory.cs index 8502c82..b4865c2 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Inventory/HorseInventory.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Inventory/HorseInventory.cs @@ -40,6 +40,12 @@ namespace HISP.Game.Inventory Database.AddHorse(horse); horsesList.Add(horse); } + + public void DeleteHorse(HorseInstance horse) + { + Database.RemoveHorse(horse.RandomId); + horsesList.Remove(horse); + } public bool HorseIdExist(int randomId) { diff --git a/Horse Isle Server/Horse Isle Server/Game/Messages.cs b/Horse Isle Server/Horse Isle Server/Game/Messages.cs index 4d9ad4f..45926e8 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Messages.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Messages.cs @@ -231,6 +231,10 @@ namespace HISP.Game public static string HorseSetAutoSell; public static string HorseTackFailAutoSell; + public static string HorseAreYouSureYouWantToReleaseFormat; + public static string HorseCantReleaseTheHorseYourRidingOn; + public static string HorseReleasedMeta; + public static string HorseReleasedBy; // Horse compainion menu public static string HorseCompanionMenuHeaderFormat; @@ -447,6 +451,15 @@ namespace HISP.Game // Click public static string NothingInterestingHere; + + public static string FormatHorseReleasedBy(string username) + { + return HorseReleasedBy.Replace("%USERNAME%", username); + } + public static string FormatHorseAreYouSureMessage(int randomId) + { + return HorseAreYouSureYouWantToReleaseFormat.Replace("%RANDOMID%", randomId.ToString()); + } public static string FormatHorseCompanionRemoveMessage(string horseName) { return HorseCompanionRemoveMessageFormat.Replace("%HORSENAME%", horseName); diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs index 5170aa0..547b04d 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs @@ -317,11 +317,20 @@ namespace HISP.Game throw new Exception("A mathematically impossible error occured. please check wether the laws of physics still apply."); } + public static string BuildHorseReleased() + { + string message = ""; + message += Messages.HorseReleasedMeta; + message += Messages.BackToMapHorse; + message += Messages.MetaTerminator; + return message; + + } public static string BuildTopHighscores(string gameName) { Highscore.HighscoreTableEntry[] scores = Database.GetTopScores(gameName, 20); if (scores.Length <= 0) - return "No scores recorded."; + return "ERROR: No scores recorded."; string message = ""; message += Messages.FormatHighscoreHeader(gameName); @@ -999,6 +1008,14 @@ namespace HISP.Game return message; } + + public static string BuildHorseReleaseConfirmationMessage(HorseInstance horse) + { + string message = Messages.FormatHorseAreYouSureMessage(horse.RandomId); + message += Messages.BackToMapHorse; + message += Messages.MetaTerminator; + return message; + } public static string BuildHorseCompanionEquipMenu(HorseInstance horse, User user) { string message = ""; diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs index 7f55d38..9fa43f9 100644 --- a/Horse Isle Server/Horse Isle Server/Player/User.cs +++ b/Horse Isle Server/Horse Isle Server/Player/User.cs @@ -45,6 +45,7 @@ namespace HISP.Player public Inn LastVisitedInn; public HorseInventory HorseInventory; public HorseInstance LastViewedHorse; + public HorseInstance CurrentlyRidingHorse; public PlayerQuests Quests; public Highscore Highscores; public Award Awards; diff --git a/Horse Isle Server/Horse Isle Server/Server/Database.cs b/Horse Isle Server/Horse Isle Server/Server/Database.cs index fa2ce07..89359cb 100644 --- a/Horse Isle Server/Horse Isle Server/Server/Database.cs +++ b/Horse Isle Server/Horse Isle Server/Server/Database.cs @@ -394,6 +394,19 @@ namespace HISP.Server } } + public static void RemoveHorse(int randomId) + { + using (MySqlConnection db = new MySqlConnection(ConnectionString)) + { + db.Open(); + MySqlCommand sqlCommand = db.CreateCommand(); + sqlCommand.CommandText = "DELETE FROM Horses WHERE randomId=@randomId"; + sqlCommand.Parameters.AddWithValue("@randomId", randomId); + sqlCommand.ExecuteNonQuery(); + sqlCommand.Dispose(); + } + } + public static void AddHorse(HorseInstance horse) { diff --git a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs index eefaa76..7e6f3ae 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameDataJson.cs @@ -669,6 +669,11 @@ namespace HISP.Server Messages.HorseChangeAutoSell = gameData.messages.meta.horse.horse_inventory.change_auto_sell; Messages.HorseTackFailAutoSell = gameData.messages.meta.horse.tack_fail_autosell; + Messages.HorseAreYouSureYouWantToReleaseFormat = gameData.messages.meta.horse.horse_release; + Messages.HorseCantReleaseTheHorseYourRidingOn = gameData.messages.meta.horse.cant_release_currently_riding; + Messages.HorseReleasedMeta = gameData.messages.meta.horse.released_horse; + Messages.HorseReleasedBy = gameData.messages.meta.horse.released_by_message; + // Horse companion menu Messages.HorseCompanionMenuHeaderFormat = gameData.messages.meta.horse.companion_menu.menu_header; Messages.HorseCompnaionMenuCurrentCompanionFormat = gameData.messages.meta.horse.companion_menu.selected_companion; diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index 004b320..b7119e8 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -304,6 +304,60 @@ namespace HISP.Server Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to feed a non existant item to a horse."); break; } + case PacketBuilder.HORSE_RELEASE: + randomId = 0; + packetStr = Encoding.UTF8.GetString(packet); + randomIdStr = packetStr.Substring(2, packetStr.Length - 4); + 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)) + { + if(World.InTown(sender.LoggedinUser.X, sender.LoggedinUser.Y)) + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to reelease a horse while inside a town...."); + break; + } + + + HorseInstance horseInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId); + if(sender.LoggedinUser.CurrentlyRidingHorse != null) + { + if(horseInst.RandomId == sender.LoggedinUser.CurrentlyRidingHorse.RandomId) + { + byte[] errorChatPacket = PacketBuilder.CreateChat(Messages.HorseCantReleaseTheHorseYourRidingOn, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(errorChatPacket); + break; + } + + } + + if (horseInst.Description == "") + horseInst.Description += Messages.FormatHorseReleasedBy(sender.LoggedinUser.Username); + + Logger.InfoPrint(sender.LoggedinUser.Username + " RELEASED HORSE: " + horseInst.Name + " (a " + horseInst.Breed.Name + ")."); + + sender.LoggedinUser.HorseInventory.DeleteHorse(horseInst); + new WildHorse(horseInst, sender.LoggedinUser.X, sender.LoggedinUser.Y, 60, true); + + sender.LoggedinUser.LastViewedHorse = horseInst; + sender.LoggedinUser.MetaPriority = true; + byte[] metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseReleased()); + sender.SendPacket(metaPacket); + break; + } + else + { + Logger.HackerPrint(sender.LoggedinUser.Username + " Tried to tack at a non existant horse."); + break; + } case PacketBuilder.HORSE_TACK: randomId = 0; packetStr = Encoding.UTF8.GetString(packet); @@ -508,6 +562,8 @@ namespace HISP.Server } if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId)) { + sender.LoggedinUser.CurrentlyRidingHorse = null; + byte[] stopRidingHorseMessagePacket = PacketBuilder.CreateChat(Messages.HorseStopRidingMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(stopRidingHorseMessagePacket); @@ -545,7 +601,9 @@ namespace HISP.Server string ridingHorseMessage = Messages.FormatHorseRidingMessage(horseInst.Name); byte[] ridingHorseMessagePacket = PacketBuilder.CreateChat(ridingHorseMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(ridingHorseMessagePacket); - + + sender.LoggedinUser.CurrentlyRidingHorse = horseInst; + // Determine what sprite to use; int incBy = 0; switch(horseInst.Color) @@ -1040,6 +1098,15 @@ namespace HISP.Server sender.SendPacket(metaPacket); } break; + case "8": + if(sender.LoggedinUser.LastViewedHorse != null) + { + sender.LoggedinUser.MetaPriority = true; + HorseInstance horseInstance = sender.LoggedinUser.LastViewedHorse; + metaPacket = PacketBuilder.CreateMetaPacket(Meta.BuildHorseReleaseConfirmationMessage(horseInstance)); + sender.SendPacket(metaPacket); + } + break; case "11": // Randomize horse name if (sender.LoggedinUser.LastViewedHorse != null) { diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index e5e26aa..2235e85 100644 --- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs @@ -53,6 +53,7 @@ namespace HISP.Server public const byte HORSE_PROFILE = 0x2C; public const byte HORSE_PROFILE_EDIT = 0x14; public const byte HORSE_TRY_CAPTURE = 0x1C; + public const byte HORSE_RELEASE = 0x19; public const byte HORSE_TACK = 0x16; public const byte HORSE_GIVE_FEED = 0x1B; public const byte HORSE_TACK_EQUIP = 0x3C;