From e6b02822459b423ecd5986e4cb62d9a27391678d Mon Sep 17 00:00:00 2001 From: SilicaAndPina Date: Sat, 13 Feb 2021 21:39:25 +1300 Subject: [PATCH] Add telescope, and shortcuts --- DataCollection/gamedata.json | 1 + .../HorseIsleServer/Game/Messages.cs | 3 + .../HorseIsleServer/Player/User.cs | 1 + .../HorseIsleServer/Server/GameClient.cs | 3 + .../HorseIsleServer/Server/GameDataJson.cs | 3 + .../HorseIsleServer/Server/GameServer.cs | 264 ++++++++++-------- .../HorseIsleServer/Server/PacketBuilder.cs | 41 +++ 7 files changed, 206 insertions(+), 110 deletions(-) diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index 5b04155..9f744c5 100755 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -58,6 +58,7 @@ "random_movement":"You are sooo %STAT%. You wander dizzily in a different direction.", "incorrect_password":"Incorrect. You will have to find the correct answer somewhere...", "player_here":"%USERNAME% here", + "no_telescope":"You do not have a telescope to use! You try making circles with your hands and placing them in front of one eye, but it is of minimal aid...", "treasure":{ "pirate_treasure":"Wow! You found buried treasure worth $%PRIZE%! Gotta love those pirates!", "pot_of_gold":"YEA! You found the fabled pot of gold at the end of the rainbow! It was worth $%PRIZE%!" diff --git a/Horse Isle Server/HorseIsleServer/Game/Messages.cs b/Horse Isle Server/HorseIsleServer/Game/Messages.cs index b5bb486..9f84dc0 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Messages.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Messages.cs @@ -643,6 +643,9 @@ namespace HISP.Game public static string LongFullLine; public static string MetaTerminator; + // Shortcuts + public static string NoTelescope; + // Drawing room public static string DrawingLastToDrawFormat; public static string DrawingContentsSavedInSlotFormat; diff --git a/Horse Isle Server/HorseIsleServer/Player/User.cs b/Horse Isle Server/HorseIsleServer/Player/User.cs index 3fe45a7..0824688 100755 --- a/Horse Isle Server/HorseIsleServer/Player/User.cs +++ b/Horse Isle Server/HorseIsleServer/Player/User.cs @@ -82,6 +82,7 @@ namespace HISP.Player public Inn LastVisitedInn; public HorseInventory HorseInventory; public HorseInstance LastViewedHorse; + public int LastRiddenHorse = 0; public HorseInstance CurrentlyRidingHorse; public Tracking TrackedItems; public Ranch OwnedRanch = null; diff --git a/Horse Isle Server/HorseIsleServer/Server/GameClient.cs b/Horse Isle Server/HorseIsleServer/Server/GameClient.cs index 439105f..15e2fb4 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameClient.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameClient.cs @@ -283,6 +283,9 @@ namespace HISP.Server case PacketBuilder.PACKET_NPC: GameServer.OnNpcInteraction(this, Packet); break; + case PacketBuilder.PACKET_BIRDMAP: + GameServer.OnBirdMapRequested(this, Packet); + break; case PacketBuilder.PACKET_SWFMODULE: GameServer.OnSwfModuleCommunication(this, Packet); break; diff --git a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs index d9eeccb..9c9ce19 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs @@ -1300,6 +1300,9 @@ namespace HISP.Server Messages.PasswordEntry = gameData.messages.meta.password_input; Messages.VenusFlyTrapFormat = gameData.messages.meta.venus_flytrap_format; + // Shortcut + Messages.NoTelescope = gameData.messages.no_telescope; + // Inn Messages.InnBuyMeal = gameData.messages.meta.inn.buy_meal; Messages.InnBuyRest = gameData.messages.meta.inn.buy_rest; diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs index ba89a7b..84f3ae6 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs @@ -115,7 +115,25 @@ namespace HISP.Server sender.SendPacket(crossDomainPolicyResponse); } + public static void OnBirdMapRequested(GameClient sender, byte[] packet) + { + if (!sender.LoggedIn) + { + Logger.ErrorPrint(sender.RemoteIp + " Requested Bird Map when not logged in."); + return; + } + if(sender.LoggedinUser.Inventory.HasItemId(Item.Telescope)) + { + byte[] birdMapPacket = PacketBuilder.CreateBirdMap(sender.LoggedinUser.X, sender.LoggedinUser.Y); + sender.SendPacket(birdMapPacket); + } + else + { + byte[] noTelescopeMessage = PacketBuilder.CreateChat(Messages.NoTelescope, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(noTelescopeMessage); + } + } public static void OnHorseInteraction(GameClient sender, byte[] packet) { if (!sender.LoggedIn) @@ -216,9 +234,6 @@ namespace HISP.Server if (horsePetInst.BasicStats.Tiredness - randTiredMinus <= 0) msgs += Messages.HorsePetTooTired; - - - horsePetInst.BasicStats.Tiredness -= randTiredMinus; horsePetInst.BasicStats.Mood += randMoodAddition; @@ -1087,6 +1102,21 @@ namespace HISP.Server randomId = 0; packetStr = Encoding.UTF8.GetString(packet); randomIdStr = packetStr.Substring(2, packetStr.Length - 4); + + if(randomIdStr == "") // F7 Shortcut + { + if(sender.LoggedinUser.CurrentlyRidingHorse != null) + { + StopRidingHorse(sender); + } + else + { + if(sender.LoggedinUser.HorseInventory.HorseIdExist(sender.LoggedinUser.LastRiddenHorse)) + StartRidingHorse(sender, sender.LoggedinUser.LastRiddenHorse); + } + break; + } + try { randomId = int.Parse(randomIdStr); @@ -1099,18 +1129,7 @@ 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); - - - sender.LoggedinUser.Facing %= 5; - byte[] rideHorsePacket = PacketBuilder.CreateHorseRidePacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, 10, true); - sender.SendPacket(rideHorsePacket); - sender.LoggedinUser.NoClip = false; - - UpdateUserInfo(sender.LoggedinUser); + StopRidingHorse(sender); } else { @@ -1134,100 +1153,7 @@ namespace HISP.Server } if (sender.LoggedinUser.HorseInventory.HorseIdExist(randomId)) { - HorseInstance horseMountInst = sender.LoggedinUser.HorseInventory.GetHorseById(randomId); - - if(horseMountInst.Equipment.Saddle == null || horseMountInst.Equipment.SaddlePad == null || horseMountInst.Equipment.Bridle == null) - { - byte[] horseNotTackedMessage = PacketBuilder.CreateChat(Messages.HorseCannotMountUntilTackedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); - sender.SendPacket(horseNotTackedMessage); - break; - } - - string ridingHorseMessage = Messages.FormatHorseRidingMessage(horseMountInst.Name); - byte[] ridingHorseMessagePacket = PacketBuilder.CreateChat(ridingHorseMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); - sender.SendPacket(ridingHorseMessagePacket); - - sender.LoggedinUser.CurrentlyRidingHorse = horseMountInst; - - // Determine what sprite to use; - int incBy = 0; - switch(horseMountInst.Color) - { - case "brown": - incBy = 1; - break; - case "cremello": - case "white": - incBy = 2; - break; - case "black": - incBy = 3; - break; - case "chestnut": - incBy = 4; - break; - case "bay": - incBy = 5; - break; - case "grey": - incBy = 6; - break; - case "dun": - incBy = 7; - break; - case "palomino": - incBy = 8; - break; - case "roan": - incBy = 9; - break; - case "pinto": - incBy = 10; - break; - } - - - if(horseMountInst.Breed.Type == "zebra") - { - incBy = 11; - } - if(horseMountInst.Breed.Id == 5) // Appaloosa - { - if(horseMountInst.Color == "brown") - incBy = 12; - } - if (horseMountInst.Breed.Type == "camel") - { - if (horseMountInst.Color == "brown") - incBy = 13; - if (horseMountInst.Color == "white") - incBy = 14; - - } - if (horseMountInst.Breed.Type == "unicorn") - { - incBy = 15; - } - if (horseMountInst.Breed.Type == "pegasus") - { - incBy = 16; - sender.LoggedinUser.NoClip = true; - } - if(horseMountInst.Breed.Id == 170) // Unipeg - { - incBy = 17; - sender.LoggedinUser.NoClip = true; - } - - incBy *= 5; - sender.LoggedinUser.Facing %= 5; - sender.LoggedinUser.Facing += incBy; - - - byte[] rideHorsePacket = PacketBuilder.CreateHorseRidePacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, 10, true); - sender.SendPacket(rideHorsePacket); - - UpdateUserInfo(sender.LoggedinUser); + StartRidingHorse(sender, randomId); break; } else @@ -4112,6 +4038,11 @@ namespace HISP.Server sender.LoggedinUser.Teleport(sender.LoggedinUser.OwnedRanch.X, sender.LoggedinUser.OwnedRanch.Y); } + if(itm.ItemId == Item.Telescope) + { + byte[] birdMap = PacketBuilder.CreateBirdMap(sender.LoggedinUser.X, sender.LoggedinUser.Y); + sender.SendPacket(birdMap); + } else { Logger.ErrorPrint(sender.LoggedinUser.Username + "Tried to use item with undefined action- ID: " + itm.ItemId); @@ -4935,7 +4866,7 @@ namespace HISP.Server * Get(Some Information) */ - + public static bool IsUserOnline(int id) { try @@ -5330,6 +5261,119 @@ namespace HISP.Server /* * Other... */ + public static void StartRidingHorse(GameClient sender, int horseRandomId) + { + HorseInstance horseMountInst = sender.LoggedinUser.HorseInventory.GetHorseById(horseRandomId); + + if (horseMountInst.Equipment.Saddle == null || horseMountInst.Equipment.SaddlePad == null || horseMountInst.Equipment.Bridle == null) + { + byte[] horseNotTackedMessage = PacketBuilder.CreateChat(Messages.HorseCannotMountUntilTackedMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(horseNotTackedMessage); + return; + } + + string ridingHorseMessage = Messages.FormatHorseRidingMessage(horseMountInst.Name); + byte[] ridingHorseMessagePacket = PacketBuilder.CreateChat(ridingHorseMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(ridingHorseMessagePacket); + + sender.LoggedinUser.CurrentlyRidingHorse = horseMountInst; + + // Determine what sprite to use; + int incBy = 0; + switch (horseMountInst.Color) + { + case "brown": + incBy = 1; + break; + case "cremello": + case "white": + incBy = 2; + break; + case "black": + incBy = 3; + break; + case "chestnut": + incBy = 4; + break; + case "bay": + incBy = 5; + break; + case "grey": + incBy = 6; + break; + case "dun": + incBy = 7; + break; + case "palomino": + incBy = 8; + break; + case "roan": + incBy = 9; + break; + case "pinto": + incBy = 10; + break; + } + + + if (horseMountInst.Breed.Type == "zebra") + { + incBy = 11; + } + if (horseMountInst.Breed.Id == 5) // Appaloosa + { + if (horseMountInst.Color == "brown") + incBy = 12; + } + if (horseMountInst.Breed.Type == "camel") + { + if (horseMountInst.Color == "brown") + incBy = 13; + if (horseMountInst.Color == "white") + incBy = 14; + + } + if (horseMountInst.Breed.Type == "unicorn") + { + incBy = 15; + } + if (horseMountInst.Breed.Type == "pegasus") + { + incBy = 16; + sender.LoggedinUser.NoClip = true; + } + if (horseMountInst.Breed.Id == 170) // Unipeg + { + incBy = 17; + sender.LoggedinUser.NoClip = true; + } + + incBy *= 5; + sender.LoggedinUser.Facing %= 5; + sender.LoggedinUser.Facing += incBy; + sender.LoggedinUser.LastRiddenHorse = horseRandomId; + + + byte[] rideHorsePacket = PacketBuilder.CreateHorseRidePacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, 10, true); + sender.SendPacket(rideHorsePacket); + + UpdateUserInfo(sender.LoggedinUser); + } + public static void StopRidingHorse(GameClient sender) + { + sender.LoggedinUser.CurrentlyRidingHorse = null; + + byte[] stopRidingHorseMessagePacket = PacketBuilder.CreateChat(Messages.HorseStopRidingMessage, PacketBuilder.CHAT_BOTTOM_RIGHT); + sender.SendPacket(stopRidingHorseMessagePacket); + + + sender.LoggedinUser.Facing %= 5; + byte[] rideHorsePacket = PacketBuilder.CreateHorseRidePacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, 10, true); + sender.SendPacket(rideHorsePacket); + sender.LoggedinUser.NoClip = false; + + UpdateUserInfo(sender.LoggedinUser); + } public static bool ProcessMapCodeWithArg(GameClient forClient, World.SpecialTile tile) { string mapCode = tile.Code; diff --git a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs index e124db1..a399bfb 100755 --- a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs +++ b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs @@ -26,6 +26,7 @@ namespace HISP.Server public const byte PACKET_SWF_MODULE_FORCE = 0x28; public const byte PACKET_SWF_MODULE_GENTLE = 0x2A; public const byte PACKET_PLACE_INFO = 0x1E; + public const byte PACKET_BIRDMAP = 0x76; public const byte PACKET_HORSE = 0x19; public const byte PACKET_AREA_DEFS = 0x79; public const byte PACKET_ITEM_INTERACTION = 0x1E; @@ -173,6 +174,46 @@ namespace HISP.Server public const byte DIRECTION_TELEPORT = 4; public const byte DIRECTION_NONE = 10; + + public static byte[] CreateBirdMap(int playerX, int playerY) + { + MemoryStream ms = new MemoryStream(); + + int xstart = playerX - 24; + int ystart = playerY - 15; + + ms.WriteByte(PacketBuilder.PACKET_BIRDMAP); + + for (int rely = 0; rely <= 30; rely++) + { + for (int relx = 0; relx <= 48; relx++) + { + int tileId = Map.GetTileId(xstart + relx, ystart + rely, false); + int otileId = Map.GetTileId(xstart + relx, ystart + rely, true); + + if (tileId >= 190) + { + ms.WriteByte((byte)190); + tileId -= 100; + } + ms.WriteByte((byte)tileId); + + if (otileId >= 190) + { + ms.WriteByte((byte)190); + otileId -= 100; + } + ms.WriteByte((byte)otileId); + + } + } + + + + ms.WriteByte(PACKET_TERMINATOR); + ms.Seek(0x00, SeekOrigin.Begin); + return ms.ToArray(); + } public static byte[] CreateDrawingUpdatePacket(string Drawing) { MemoryStream ms = new MemoryStream();