diff --git a/Horse Isle Server/Horse Isle Server/Game/Horse/WildHorse.cs b/Horse Isle Server/Horse Isle Server/Game/Horse/WildHorse.cs index d5bdd12..194504a 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Horse/WildHorse.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Horse/WildHorse.cs @@ -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; diff --git a/Horse Isle Server/Horse Isle Server/Game/Meta.cs b/Horse Isle Server/Horse Isle Server/Game/Meta.cs index 16af401..9b54403 100644 --- a/Horse Isle Server/Horse Isle Server/Game/Meta.cs +++ b/Horse Isle Server/Horse Isle Server/Game/Meta.cs @@ -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 diff --git a/Horse Isle Server/Horse Isle Server/Player/User.cs b/Horse Isle Server/Horse Isle Server/Player/User.cs index 21b2554..7f55d38 100644 --- a/Horse Isle Server/Horse Isle Server/Player/User.cs +++ b/Horse Isle Server/Horse Isle Server/Player/User.cs @@ -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; diff --git a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs index 4713d29..dfa35fd 100644 --- a/Horse Isle Server/Horse Isle Server/Server/GameServer.cs +++ b/Horse Isle Server/Horse Isle Server/Server/GameServer.cs @@ -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); } diff --git a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs index 9b437d4..d2f5eca 100644 --- a/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs +++ b/Horse Isle Server/Horse Isle Server/Server/PacketBuilder.cs @@ -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; }