Add telescope, and shortcuts

This commit is contained in:
SilicaAndPina 2021-02-13 21:39:25 +13:00
parent 8714966822
commit e6b0282245
7 changed files with 206 additions and 110 deletions

View file

@ -58,6 +58,7 @@
"random_movement":"You are sooo <B>%STAT%</B>. 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%!"

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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();