try and fail at making horses work >_<

This commit is contained in:
SilicaAndPina 2021-01-10 22:57:56 +13:00
parent 60fbc4b3b4
commit 6c01c98a29
5 changed files with 279 additions and 121 deletions

View file

@ -173,7 +173,8 @@ namespace HISP.Game.Horse
while(wildHorses.Count < 40)
{
HorseInfo.Breed horseBreed = HorseInfo.Breeds[GameServer.RandomNumberGenerator.Next(0, HorseInfo.Breeds.Count)];
if (horseBreed.Swf == "")
continue;
if (horseBreed.SpawnInArea == "none") // no unipegs >_>
continue;

View file

@ -655,6 +655,8 @@ namespace HISP.Game
string message = "";
foreach(HorseInfo.Breed breed in HorseInfo.Breeds.OrderBy(o => o.Name).ToList())
{
if (breed.Swf == "")
continue;
if (breed.Type == "horse")
message += Messages.FormatHorseBreed(breed.Name, breed.Id);
else

View file

@ -45,7 +45,6 @@ namespace HISP.Player
public Inn LastVisitedInn;
public HorseInventory HorseInventory;
public HorseInstance LastViewedHorse;
public HorseInstance Riding;
public PlayerQuests Quests;
public Highscore Highscores;
public Award Awards;

View file

@ -275,7 +275,77 @@ namespace HISP.Server
string ridingHorseMessage = Messages.FormatHorseRidingMessage(horseInst.Name);
byte[] ridingHorseMessagePacket = PacketBuilder.CreateChat(ridingHorseMessage, PacketBuilder.CHAT_BOTTOM_RIGHT);
sender.SendPacket(ridingHorseMessagePacket);
sender.LoggedinUser.Riding = horseInst;
// Determine what sprite to use;
int incBy = 0;
switch(horseInst.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(horseInst.Breed.Type == "zebra")
{
incBy = 11;
}
if (horseInst.Breed.Type == "camel")
{
if (horseInst.Color == "brown")
incBy = 13;
if (horseInst.Color == "white")
incBy = 14;
}
if (horseInst.Breed.Type == "unicorn")
{
incBy = 15;
}
if (horseInst.Breed.Type == "pegasus")
{
incBy = 16;
}
if(horseInst.Breed.Id == 170) // Unipeg
{
incBy = 17;
}
incBy *= 5;
sender.LoggedinUser.Facing += incBy;
byte[] rideHorsePacket = PacketBuilder.CreateHorseRidePacket(sender.LoggedinUser.X, sender.LoggedinUser.Y, sender.LoggedinUser.CharacterId, sender.LoggedinUser.Facing, 10, true);
Logger.DebugPrint("packet dump: " +BitConverter.ToString(rideHorsePacket).Replace("-", " "));
sender.SendPacket(rideHorsePacket);
break;
}
@ -1403,6 +1473,18 @@ namespace HISP.Server
int onHorse = 0;
int facing = sender.LoggedinUser.Facing;
while (facing >= 5)
{
facing = facing - 5;
onHorse++;
}
byte direction = 0;
int newX = loggedInUser.X;
int newY = loggedInUser.Y;
bool moveTwo = false;
if (movementDirection == PacketBuilder.MOVE_ESCAPE)
{
@ -1410,9 +1492,6 @@ namespace HISP.Server
if (World.InSpecialTile(loggedInUser.X, loggedInUser.Y))
{
int newX = loggedInUser.X;
int newY = loggedInUser.Y;
World.SpecialTile tile = World.GetSpecialTile(loggedInUser.X, loggedInUser.Y);
if (tile.ExitX != 0)
newX = tile.ExitX;
@ -1448,74 +1527,70 @@ namespace HISP.Server
Direction = PacketBuilder.DIRECTION_DOWN;
}
loggedInUser.Facing = Direction + (onHorse * 5);
Logger.DebugPrint("Exiting player: " + loggedInUser.Username + " to: " + loggedInUser.X + "," + loggedInUser.Y);
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, Direction, Direction, true);
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, Direction, true);
sender.SendPacket(moveResponse);
Update(sender);
return;
}
if (movementDirection == PacketBuilder.MOVE_UP)
{
direction = PacketBuilder.DIRECTION_UP;
if (Map.CheckPassable(newX, newY - 1))
newY -= 1;
loggedInUser.Facing = PacketBuilder.DIRECTION_UP;
if (Map.CheckPassable(loggedInUser.X, loggedInUser.Y - 1))
{
loggedInUser.Y -= 1;
byte[] moveUpResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, sender.LoggedinUser.Facing, PacketBuilder.DIRECTION_UP, true);
sender.SendPacket(moveUpResponse);
}
else
{
byte[] moveUpResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, sender.LoggedinUser.Facing, PacketBuilder.DIRECTION_NONE, false);
sender.SendPacket(moveUpResponse);
}
if (loggedInUser.Facing == (direction + (onHorse * 5))&& onHorse != 0) // Double move
if (Map.CheckPassable(newX, newY - 1))
{
newY -= 1;
moveTwo = true;
}
}
else if (movementDirection == PacketBuilder.MOVE_LEFT)
{
loggedInUser.Facing = PacketBuilder.DIRECTION_LEFT;
if (Map.CheckPassable(loggedInUser.X - 1, loggedInUser.Y))
{
loggedInUser.X -= 1;
byte[] moveLeftResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_LEFT, true);
sender.SendPacket(moveLeftResponse);
}
else
{
byte[] moveLeftResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_NONE, false);
sender.SendPacket(moveLeftResponse);
}
direction = PacketBuilder.DIRECTION_LEFT;
if (Map.CheckPassable(newX - 1, newY))
newX -= 1;
if (loggedInUser.Facing == (direction + (onHorse * 5)) && onHorse != 0) // Double move
if (Map.CheckPassable(newX - 1, newY))
{
newX -= 1;
moveTwo = true;
}
}
else if (movementDirection == PacketBuilder.MOVE_RIGHT)
{
loggedInUser.Facing = PacketBuilder.DIRECTION_RIGHT;
if (Map.CheckPassable(loggedInUser.X + 1, loggedInUser.Y))
{
loggedInUser.X += 1;
byte[] moveLeftResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_RIGHT, true);
sender.SendPacket(moveLeftResponse);
}
else
{
byte[] moveLeftResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_NONE, false);
sender.SendPacket(moveLeftResponse);
}
direction = PacketBuilder.DIRECTION_RIGHT;
if (Map.CheckPassable(newX + 1, newY))
newX += 1;
if (loggedInUser.Facing == (direction + (onHorse * 5)) && onHorse != 0) // Double move
if (Map.CheckPassable(newX + 1, newY))
{
newX += 1;
moveTwo = true;
}
}
else if (movementDirection == PacketBuilder.MOVE_DOWN)
{
loggedInUser.Facing = PacketBuilder.DIRECTION_DOWN;
if (Map.CheckPassable(loggedInUser.X, loggedInUser.Y + 1))
{
loggedInUser.Y += 1;
byte[] moveDownResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_DOWN, true);
sender.SendPacket(moveDownResponse);
}
else
{
byte[] moveDownResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_NONE, false);
sender.SendPacket(moveDownResponse);
}
direction = PacketBuilder.DIRECTION_DOWN;
if (Map.CheckPassable(newX, newY + 1))
newY += 1;
if (loggedInUser.Facing == (direction + (onHorse * 5)) && onHorse != 0) // Double move
if (Map.CheckPassable(newX, newY + 1))
{
newY += 1;
moveTwo = true;
}
}
else if(movementDirection == PacketBuilder.MOVE_UPDATE)
{
@ -1523,6 +1598,21 @@ namespace HISP.Server
return;
}
if(loggedInUser.Y != newY || loggedInUser.X != newX)
{
loggedInUser.Facing = direction + (onHorse * 5);
if (moveTwo)
direction += 20;
loggedInUser.Y = newY;
loggedInUser.X = newX;
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, direction, true);
sender.SendPacket(moveResponse);
}
else
{
byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, PacketBuilder.DIRECTION_NONE, false);
sender.SendPacket(moveResponse);
}
Update(sender);
}

View file

@ -2,6 +2,7 @@
using System.IO;
using System.Text;
using HISP.Game;
using HISP.Game.Horse;
using HISP.Game.SwfModules;
namespace HISP.Server
@ -96,6 +97,7 @@ namespace HISP.Server
public const byte MOVE_ESCAPE = 0x18;
public const byte MOVE_UPDATE = 0x0A;
public const byte CHAT_BOTTOM_LEFT = 0x14;
public const byte CHAT_BOTTOM_RIGHT = 0x15;
public const byte CHAT_DM_RIGHT = 0x16;
@ -275,6 +277,33 @@ namespace HISP.Server
return Packet;
}
public static byte[] CreateHorseRidePacket(int x, int y, int charId, int facing, int direction, bool walk)
{
// Header information
MemoryStream ms = new MemoryStream();
ms.WriteByte(PACKET_MOVE);
ms.WriteByte((byte)(((x - 4) / 64) + 20)); //1
ms.WriteByte((byte)(((x - 4) % 64) + 20)); //2
ms.WriteByte((byte)(((y - 1) / 64) + 20)); //3
ms.WriteByte((byte)(((y - 1) % 64) + 20)); //4
ms.WriteByte((byte)(facing + 20)); //5
ms.WriteByte((byte)((charId / 64) + 20)); //6
ms.WriteByte((byte)((charId % 64) + 20)); //7
ms.WriteByte((byte)(direction + 20)); //8
ms.WriteByte((byte)(Convert.ToInt32(walk) + 20)); //9\
ms.WriteByte(PACKET_TERMINATOR);
ms.Seek(0x00, SeekOrigin.Begin);
byte[] packetData = ms.ToArray();
ms.Dispose();
return packetData;
}
public static byte[] CreateMovementPacket(int x, int y,int charId,int facing, int direction, bool walk)
{
// Header information
@ -291,116 +320,153 @@ namespace HISP.Server
ms.WriteByte((byte)((charId / 64) + 20)); //6
ms.WriteByte((byte)((charId % 64) + 20)); //7
ms.WriteByte((byte)(direction + 20)); //8
ms.WriteByte((byte)(Convert.ToInt32(walk) + 20)); //9
// Map Data
if (direction >= 20)
// Map Data
bool moveTwo = false;
if(direction >= 20)
{
direction -= 20;
moveTwo = true;
}
int ystart = y - 4;
int xstart = x - 6;
if (direction == DIRECTION_UP)
{
for (int relx = 0; relx <= 12; relx++)
int totalY = 0;
if (moveTwo)
totalY = 1;
for (int relY = totalY; relY >= 0; relY--)
{
int tileId = Map.GetTileId(xstart + relx, ystart, false);
int otileId = Map.GetTileId(xstart + relx, ystart, true);
if (tileId >= 190)
for (int relx = 0; relx <= 12; relx++)
{
ms.WriteByte((byte)190);
tileId -= 100;
}
ms.WriteByte((byte)tileId);
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);
if (otileId >= 190)
{
ms.WriteByte((byte)190);
otileId -= 100;
}
ms.WriteByte((byte)otileId);
}
}
if (direction == DIRECTION_LEFT)
{
for (int rely = 0; rely <= 9; rely++)
int totalX = 0;
if (moveTwo)
totalX = 1;
for (int relX = totalX; relX >= 0; relX--)
{
int tileId = Map.GetTileId(xstart, ystart + rely, false);
int otileId = Map.GetTileId(xstart, ystart + rely, true);
if (tileId >= 190)
for (int rely = 0; rely <= 9; rely++)
{
ms.WriteByte((byte)190);
tileId -= 100;
}
ms.WriteByte((byte)tileId);
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);
if (otileId >= 190)
{
ms.WriteByte((byte)190);
otileId -= 100;
}
ms.WriteByte((byte)otileId);
}
}
if (direction == DIRECTION_RIGHT)
{
for (int rely = 0; rely <= 9; rely++)
int totalX = 0;
if (moveTwo)
totalX = 1;
for (int relX = 0; relX <= totalX; relX++)
{
int tileId = Map.GetTileId(xstart + 12, ystart + rely, false);
int otileId = Map.GetTileId(xstart + 12, ystart + rely, true);
if (tileId >= 190)
for (int rely = 0; rely <= 9; rely++)
{
ms.WriteByte((byte)190);
tileId -= 100;
}
ms.WriteByte((byte)tileId);
int tileId = Map.GetTileId(xstart + relX + 12, ystart + rely, false);
int otileId = Map.GetTileId(xstart + relX + 12, 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);
if (otileId >= 190)
{
ms.WriteByte((byte)190);
otileId -= 100;
}
ms.WriteByte((byte)otileId);
}
}
if (direction == DIRECTION_DOWN)
{
for (int relx = 0; relx <= 12; relx++)
int totalY = 0;
if (moveTwo)
totalY = 1;
for (int relY = totalY; relY >= 0; relY--)
{
int tileId = Map.GetTileId(xstart + relx, ystart + 9, false);
int otileId = Map.GetTileId(xstart + relx, ystart + 9, true);
if (tileId >= 190)
for (int relx = 0; relx <= 12; relx++)
{
ms.WriteByte((byte)190);
tileId -= 100;
}
ms.WriteByte((byte)tileId);
int tileId = Map.GetTileId(xstart + relx, ystart + relY + 9 , false);
int otileId = Map.GetTileId(xstart + relx, ystart + relY + 9, 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);
if (otileId >= 190)
{
ms.WriteByte((byte)190);
otileId -= 100;
}
ms.WriteByte((byte)otileId);
}
}
if (direction == DIRECTION_TELEPORT)
{
@ -436,7 +502,7 @@ namespace HISP.Server
byte[] Packet = ms.ToArray();
ms.Dispose();
//Logger.DebugPrint(BitConverter.ToString(Packet).Replace("-", " "));
Logger.DebugPrint(BitConverter.ToString(Packet).Replace("-", " "));
return Packet;
}