diff --git a/Horse Isle Server/HorseIsleServer/Game/Meta.cs b/Horse Isle Server/HorseIsleServer/Game/Meta.cs index 592a4cc..def3eb4 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Meta.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Meta.cs @@ -307,27 +307,20 @@ namespace HISP.Game { string message = Messages.MultiroomPlayersParticipating; - if(id != null) // Special type + + Multiroom room = Multiroom.GetMultiroom(user.X, user.Y); + room.Join(user); + + foreach (User userOnTile in room.JoinedUsers) { - foreach (User userOnTile in GameServer.GetUsersOnSpecialTileCode("MULTIROOM-" + id)) - { - if (userOnTile.Id == user.Id) - continue; - message += Messages.FormatMultiroomParticipent(userOnTile.Username); - } - message += Messages.R1; - } - else if(id == null) // Generic - { - foreach (User userOnTile in GameServer.GetUsersAt(user.X, user.Y, true, true)) - { - if (userOnTile.Id == user.Id) - continue; - message += Messages.FormatMultiroomParticipent(userOnTile.Username); - } - message += Messages.R1; + if (userOnTile.Id == user.Id) + continue; + + message += Messages.FormatMultiroomParticipent(userOnTile.Username); } + message += Messages.R1; + if(id == null) // Generic { // Do nothing diff --git a/Horse Isle Server/HorseIsleServer/Game/Multiroom.cs b/Horse Isle Server/HorseIsleServer/Game/Multiroom.cs new file mode 100644 index 0000000..cdfd80b --- /dev/null +++ b/Horse Isle Server/HorseIsleServer/Game/Multiroom.cs @@ -0,0 +1,91 @@ +using HISP.Player; +using HISP.Server; +using System.Collections.Generic; + +namespace HISP.Game +{ + public class Multiroom + { + public static List Multirooms = new List(); + public static Multiroom GetMultiroom(int x, int y) + { + foreach (Multiroom multiroom in Multirooms) + if(multiroom.x == x && multiroom.y == y) + return multiroom; + + throw new KeyNotFoundException(); + } + + public static bool IsMultiRoomAt(int x, int y) + { + foreach (Multiroom multiroom in Multirooms) + if (multiroom.x == x && multiroom.y == y) + return true; + + return false; + } + + public static void LeaveAllMultirooms(User user) + { + foreach (Multiroom room in Multirooms) + room.Leave(user); + } + + public static void CreateMultirooms() + { + Logger.InfoPrint("Creating Multirooms..."); + foreach(World.SpecialTile tile in World.SpecialTiles) + { + if (tile.Code != null) + { + if (tile.Code.StartsWith("MULTIROOM")) + { + Logger.DebugPrint("Created Multiroom @ " + tile.X.ToString() + "," + tile.Y.ToString()); + new Multiroom(tile.X, tile.Y); + } + } + } + } + + public Multiroom(int x, int y) + { + this.x = x; + this.y = y; + + Multirooms.Add(this); + } + + public int x; + public int y; + + public List JoinedUsers = new List(); + + public void Join(User user) + { + if (!JoinedUsers.Contains(user)) + { + Logger.DebugPrint(user.Username + " Joined multiroom @ " + x.ToString() + "," + y.ToString()); + JoinedUsers.Add(user); + + foreach (User joinedUser in JoinedUsers) + if (joinedUser.Id != user.Id) + GameServer.UpdateArea(joinedUser.LoggedinClient); + } + + } + + public void Leave(User user) + { + + if(JoinedUsers.Contains(user)) + { + Logger.DebugPrint(user.Username + " Left multiroom @ " + x.ToString() + "," + y.ToString()); + JoinedUsers.Remove(user); + } + + foreach (User joinedUser in JoinedUsers) + GameServer.UpdateArea(joinedUser.LoggedinClient); + + } + } +} diff --git a/Horse Isle Server/HorseIsleServer/Game/SwfModules/Brickpoet.cs b/Horse Isle Server/HorseIsleServer/Game/SwfModules/Brickpoet.cs index eb62ca7..49ca350 100755 --- a/Horse Isle Server/HorseIsleServer/Game/SwfModules/Brickpoet.cs +++ b/Horse Isle Server/HorseIsleServer/Game/SwfModules/Brickpoet.cs @@ -1,9 +1,5 @@ using HISP.Server; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace HISP.Game.SwfModules { diff --git a/Horse Isle Server/HorseIsleServer/Program.cs b/Horse Isle Server/HorseIsleServer/Program.cs index 505f4f7..5c89821 100755 --- a/Horse Isle Server/HorseIsleServer/Program.cs +++ b/Horse Isle Server/HorseIsleServer/Program.cs @@ -24,11 +24,16 @@ namespace HISP DroppedItems.Init(); WildHorse.Init(); - Brickpoet.LoadPoetryRooms(); - Auction.LoadAllAuctionRooms(); + Drawingroom.LoadAllDrawingRooms(); + Brickpoet.LoadPoetryRooms(); + Multiroom.CreateMultirooms(); + + Auction.LoadAllAuctionRooms(); + Item.DoSpecialCases(); + GameServer.StartServer(); } diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs index 1064cba..7c52158 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs @@ -3329,7 +3329,6 @@ namespace HISP.Server break; } - UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, sender.LoggedinUser); if(room.Drawing != "") { @@ -3455,7 +3454,7 @@ namespace HISP.Server } room.Drawing += drawingToAdd; - UpdateDrawingForAll(sender, drawingToAdd, true); + UpdateDrawingForAll("D" + room.Id, sender, drawingToAdd, true); byte[] loadedDrawingMessage = PacketBuilder.CreateChat(Messages.FormatDrawingRoomLoaded(slotNo), PacketBuilder.CHAT_BOTTOM_RIGHT); sender.SendPacket(loadedDrawingMessage); @@ -3510,7 +3509,7 @@ namespace HISP.Server break; } - UpdateDrawingForAll(sender, drawing, false); + UpdateDrawingForAll("D" + room.Id, sender, drawing, false); } @@ -3544,7 +3543,6 @@ namespace HISP.Server byte[] poetPacket = PacketBuilder.CreateBrickPoetListPacket(room); sender.SendPacket(poetPacket); - UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, sender.LoggedinUser); } else if(packet[3] == PacketBuilder.BRICKPOET_MOVE) { @@ -3635,7 +3633,6 @@ namespace HISP.Server sender.SendPacket(allDressupsResponse); } - UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, sender.LoggedinUser); } else // Move { @@ -3705,18 +3702,26 @@ namespace HISP.Server } } break; + case PacketBuilder.SWFMODULE_BANDHALL: // Basic + byte[] response = PacketBuilder.CreateForwardedSwfRequest(packet); + foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y)) + { + if (user.Id == sender.LoggedinUser.Id) + continue; + user.LoggedinClient.SendPacket(response); + } + break; case PacketBuilder.SWFMODULE_ARENA: if (Arena.UserHasEnteredHorseInAnyArena(sender.LoggedinUser)) { Arena arena = Arena.GetArenaUserEnteredIn(sender.LoggedinUser); - byte[] response = PacketBuilder.CreateForwardedSwfRequest(packet); + response = PacketBuilder.CreateForwardedSwfRequest(packet); foreach (Arena.ArenaEntry entry in arena.Entries.ToArray()) { if (entry.EnteredUser.Id == sender.LoggedinUser.Id) continue; if(entry.EnteredUser.LoggedinClient.LoggedIn) entry.EnteredUser.LoggedinClient.SendPacket(response); - } } @@ -4274,6 +4279,24 @@ namespace HISP.Server User loggedInUser = sender.LoggedinUser; + /* + * Player stuff + */ + + // Leave Multirooms + Multiroom.LeaveAllMultirooms(loggedInUser); + + // Cancel Trades + if (loggedInUser.TradingWith != null) + loggedInUser.TradingWith.CancelTradeMoved(); + loggedInUser.PendingBuddyRequestTo = null; + + // Close Social Windows + foreach (User sUser in loggedInUser.BeingSocializedBy.ToArray()) + UpdateArea(sUser.LoggedinClient); + loggedInUser.BeingSocializedBy.Clear(); + + // Pac-man the world. if (loggedInUser.X > Map.Width) loggedInUser.Teleport(2, loggedInUser.Y); @@ -4306,6 +4329,8 @@ namespace HISP.Server } } + // Randomly move if thirst, hunger, tiredness too low- + byte movementDirection = packet[1]; if (loggedInUser.Thirst <= 0 || loggedInUser.Hunger <= 0 || loggedInUser.Tiredness <= 0) @@ -4355,7 +4380,7 @@ namespace HISP.Server int newY = loggedInUser.Y; bool moveTwo = false; - if (movementDirection == PacketBuilder.MOVE_ESCAPE) + if (movementDirection == PacketBuilder.MOVE_ESCAPE) // Exit this place / X Button { byte Direction; @@ -4397,7 +4422,6 @@ 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, loggedInUser.Facing, Direction, true); @@ -4473,11 +4497,11 @@ namespace HISP.Server { if (moveTwo) direction += 20; + loggedInUser.Y = newY; loggedInUser.X = newX; - - // check Treasures + // Check Treasures if (Treasure.IsTileTreasure(loggedInUser.X, loggedInUser.Y)) { Treasure treasure = Treasure.GetTreasureAt(loggedInUser.X, loggedInUser.Y); @@ -4489,16 +4513,6 @@ namespace HISP.Server } } - // Cancel Trades - if (loggedInUser.TradingWith != null) - loggedInUser.TradingWith.CancelTradeMoved(); - loggedInUser.PendingBuddyRequestTo = null; - - // Close Social Windows - foreach (User sUser in loggedInUser.BeingSocializedBy.ToArray()) - UpdateArea(sUser.LoggedinClient); - loggedInUser.BeingSocializedBy.Clear(); - byte[] moveResponse = PacketBuilder.CreateMovementPacket(loggedInUser.X, loggedInUser.Y, loggedInUser.CharacterId, loggedInUser.Facing, direction, true); sender.SendPacket(moveResponse); } @@ -6434,6 +6448,9 @@ namespace HISP.Server Database.RemoveOnlineUser(sender.LoggedinUser.Id); + // Leave multirooms + Multiroom.LeaveAllMultirooms(sender.LoggedinUser); + // Remove Trade Reference sender.LoggedinUser.TradingWith = null; sender.LoggedinUser.PendingTradeTo = 0; @@ -6445,6 +6462,7 @@ namespace HISP.Server arena.DeleteEntry(sender.LoggedinUser); } + // Send disconnect message byte[] logoutMessageBytes = PacketBuilder.CreateChat(Messages.FormatLogoutMessage(sender.LoggedinUser.Username), PacketBuilder.CHAT_BOTTOM_LEFT); foreach (GameClient client in ConnectedClients) @@ -6709,11 +6727,11 @@ namespace HISP.Server UpdateUserInfo(client.LoggedinUser); } - public static void UpdateDrawingForAll(GameClient sender, string drawing, bool includingSender=false) + public static void UpdateDrawingForAll(string id, GameClient sender, string drawing, bool includingSender=false) { UpdateAreaForAll(sender.LoggedinUser.X, sender.LoggedinUser.Y); - User[] usersHere = GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y, true, true); + User[] usersHere = GetUsersOnSpecialTileCode("MULTIROOM-D" + id); foreach (User user in usersHere) { if(!includingSender) diff --git a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs index d8a740e..0c1f03f 100755 --- a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs +++ b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs @@ -116,6 +116,7 @@ namespace HISP.Server public const byte SWFMODULE_BRICKPOET = 0x5A; public const byte SWFMODULE_DRAWINGROOM = 0x5B; public const byte SWFMODULE_DRESSUPROOM = 0x5C; + public const byte SWFMODULE_BANDHALL = 0x51; public const byte DRAWINGROOM_GET_DRAWING = 0x14; public const byte DRAWINGROOM_SAVE = 0x15;