diff --git a/DataCollection/gamedata.json b/DataCollection/gamedata.json index a67ed6c..a8afda9 100755 --- a/DataCollection/gamedata.json +++ b/DataCollection/gamedata.json @@ -222,7 +222,7 @@ "other_player":"^LThe following other players are in the game room:^R1", "player_name":"^T3%PLAYERNAME%", "invite_button":"^B2I%PLAYERID%", - "accept_button":"^B2A%PLATERID%", + "accept_button":"^B2A%PLAYERID%", "sent_invite":" (sent invite)", "playing_with":" (playing with %PLAYERNAME%)", diff --git a/Horse Isle Server/HorseIsleServer/Game/Meta.cs b/Horse Isle Server/HorseIsleServer/Game/Meta.cs index 0c63767..0242ea5 100755 --- a/Horse Isle Server/HorseIsleServer/Game/Meta.cs +++ b/Horse Isle Server/HorseIsleServer/Game/Meta.cs @@ -16,6 +16,8 @@ namespace HISP.Game { // Meta + private static bool overwrite = false; + private static string buildLocationString(int x, int y) { string areaString = buildAreaString(x, y); @@ -2651,6 +2653,7 @@ namespace HISP.Game username = twoPlayerGame.Invitee.Username; else username = twoPlayerGame.Inviting.Username; + overwrite = true; return Messages.Format2PlayerGameInProgress(username); } @@ -2903,7 +2906,13 @@ namespace HISP.Game } if(TileCode == "2PLAYER") { - message += build2PlayerGame(user, TileArg); + string msg = build2PlayerGame(user, TileArg); + if (!overwrite) + message += msg; + else + message = msg; + + overwrite = false; } if(TileCode == "HORSES") { diff --git a/Horse Isle Server/HorseIsleServer/Game/TwoPlayer.cs b/Horse Isle Server/HorseIsleServer/Game/TwoPlayer.cs index b7a528a..8dfa822 100644 --- a/Horse Isle Server/HorseIsleServer/Game/TwoPlayer.cs +++ b/Horse Isle Server/HorseIsleServer/Game/TwoPlayer.cs @@ -9,7 +9,16 @@ namespace HISP.Game public class TwoPlayer { public static List TwoPlayerGames = new List(); - + public static void TwoPlayerRemove(User user) + { + foreach(TwoPlayer twoPlayerGame in TwoPlayerGames.ToArray()) + { + if((twoPlayerGame.Invitee.Id == user.Id)) + { + twoPlayerGame.CloseGame(user, true); + } + } + } public static bool IsPlayerInvitingPlayer(User sender, User checkInvites) { foreach (TwoPlayer twoPlayerGame in TwoPlayerGames.ToArray()) @@ -21,6 +30,17 @@ namespace HISP.Game } return false; } + public static TwoPlayer GetGameInvitingPlayer(User sender, User checkInvites) + { + foreach (TwoPlayer twoPlayerGame in TwoPlayerGames.ToArray()) + { + if ((twoPlayerGame.Invitee.Id == sender.Id && twoPlayerGame.Inviting.Id == checkInvites.Id) && !twoPlayerGame.Accepted) + { + return twoPlayerGame; + } + } + throw new KeyNotFoundException("not found."); + } public static bool IsPlayerInGame(User user) { @@ -83,7 +103,7 @@ namespace HISP.Game Invitee.MetaPriority = false; Inviting.MetaPriority = false; - GameServer.UpdateAreaForAll(Invitee.X, Invitee.Y); + update(); TwoPlayerGames.Remove(this); } @@ -147,10 +167,17 @@ namespace HISP.Game if(user.Id == Inviting.Id) { Accepted = true; - updateOthers(); - deleteTimer.Dispose(); + UpdateAll(); + + + byte[] startingUpGameInvitee = PacketBuilder.CreateChat(Messages.Format2PlayerStartingGame(Inviting.Username), PacketBuilder.CHAT_BOTTOM_RIGHT); + byte[] startingUpGameInvited = PacketBuilder.CreateChat(Messages.Format2PlayerStartingGame(Invitee.Username), PacketBuilder.CHAT_BOTTOM_RIGHT); + + Invitee.LoggedinClient.SendPacket(startingUpGameInvitee); + Inviting.LoggedinClient.SendPacket(startingUpGameInvited); + byte[] loadSwfInvitee = PacketBuilder.CreateSwfModulePacket(buildSwf(2), PacketBuilder.PACKET_SWF_MODULE_FORCE); byte[] loadSwfInvited = PacketBuilder.CreateSwfModulePacket(buildSwf(1), PacketBuilder.PACKET_SWF_MODULE_FORCE); @@ -160,30 +187,38 @@ namespace HISP.Game } } - public void CloseGame(User userWhoClosed) + public void CloseGame(User userWhoClosed, bool closeSilently=false) { if(userWhoClosed.Id == Inviting.Id || userWhoClosed.Id == Invitee.Id && Accepted) { - byte[] gameClosedByOther = PacketBuilder.CreateChat(Messages.TwoPlayerGameClosedOther, PacketBuilder.CHAT_BOTTOM_RIGHT); - byte[] gameClosed = PacketBuilder.CreateChat(Messages.TwoPlayerGameClosed, PacketBuilder.CHAT_BOTTOM_RIGHT); - - if (userWhoClosed.Id == Inviting.Id) - { - Invitee.LoggedinClient.SendPacket(gameClosedByOther); - Inviting.LoggedinClient.SendPacket(gameClosed); - } - else if (userWhoClosed.Id == Invitee.Id) - { - Invitee.LoggedinClient.SendPacket(gameClosed); - Inviting.LoggedinClient.SendPacket(gameClosedByOther); - } Accepted = false; + if(!closeSilently) + { + byte[] gameClosedByOther = PacketBuilder.CreateChat(Messages.TwoPlayerGameClosedOther, PacketBuilder.CHAT_BOTTOM_RIGHT); + byte[] gameClosed = PacketBuilder.CreateChat(Messages.TwoPlayerGameClosed, PacketBuilder.CHAT_BOTTOM_RIGHT); + + if (userWhoClosed.Id == Inviting.Id) + { + Invitee.LoggedinClient.SendPacket(gameClosedByOther); + Inviting.LoggedinClient.SendPacket(gameClosed); + } + else if (userWhoClosed.Id == Invitee.Id) + { + Invitee.LoggedinClient.SendPacket(gameClosed); + Inviting.LoggedinClient.SendPacket(gameClosedByOther); + } + } + Invitee.MetaPriority = false; Inviting.MetaPriority = false; - UpdateAll(); - + + if (!closeSilently) + UpdateAll(); + else + updateOthers(); + TwoPlayerGames.Remove(this); } } diff --git a/Horse Isle Server/HorseIsleServer/HorseIsleServer.csproj b/Horse Isle Server/HorseIsleServer/HorseIsleServer.csproj index 44bdec8..c0fb7ee 100755 --- a/Horse Isle Server/HorseIsleServer/HorseIsleServer.csproj +++ b/Horse Isle Server/HorseIsleServer/HorseIsleServer.csproj @@ -17,7 +17,7 @@ - + diff --git a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs index 91caa1d..cdc74b8 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameDataJson.cs @@ -1893,6 +1893,7 @@ namespace HISP.Server Messages.BallonCutscene = gameData.transport.ballon_cutscene; gameData = null; + return; } } diff --git a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs index 81f0641..1b83e86 100755 --- a/Horse Isle Server/HorseIsleServer/Server/GameServer.cs +++ b/Horse Isle Server/HorseIsleServer/Server/GameServer.cs @@ -3326,6 +3326,31 @@ namespace HISP.Server TwoPlayer twoPlayerGame = new TwoPlayer(toInvite, sender.LoggedinUser, false); } break; + case PacketBuilder.SWFMODULE_ACCEPT: + if (packet.Length < 4) + { + Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid 2PLAYER ACCEPT Packet (WRONG SIZE)"); + break; + } + packetStr = Encoding.UTF8.GetString(packet); + playerIdStr = packetStr.Substring(2, packetStr.Length - 4); + playerId = -1; + try + { + playerId = int.Parse(playerIdStr); + } + catch (Exception) { }; + + if (IsUserOnline(playerId)) + { + User toAccept = GetUserById(playerId); + if(TwoPlayer.IsPlayerInvitingPlayer(toAccept, sender.LoggedinUser)) + { + TwoPlayer twoPlayerGame = TwoPlayer.GetGameInvitingPlayer(toAccept, sender.LoggedinUser); + twoPlayerGame.Accept(sender.LoggedinUser); + } + } + break; case PacketBuilder.SWFMODULE_DRAWINGROOM: if(packet.Length < 3) { @@ -3724,13 +3749,47 @@ namespace HISP.Server } } break; - case PacketBuilder.SWFMODULE_BANDHALL: // Basic + case PacketBuilder.SWFMODULE_BANDHALL: 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_2PLAYER: + if(TwoPlayer.IsPlayerInGame(sender.LoggedinUser)) + { + TwoPlayer twoPlayerGame = TwoPlayer.GetTwoPlayerGameInProgress(sender.LoggedinUser); + + User otherUser = null; + if (twoPlayerGame.Invitee.Id == sender.LoggedinUser.Id) + otherUser = twoPlayerGame.Inviting; + else if (twoPlayerGame.Inviting.Id == sender.LoggedinUser.Id) + otherUser = twoPlayerGame.Invitee; + + response = PacketBuilder.CreateForwardedSwfRequest(packet); + otherUser.LoggedinClient.SendPacket(response); + } + break; + case PacketBuilder.SWFMODULE_CLOSE: + if (TwoPlayer.IsPlayerInGame(sender.LoggedinUser)) + { + TwoPlayer twoPlayerGame = TwoPlayer.GetTwoPlayerGameInProgress(sender.LoggedinUser); + + User otherUser = null; + if (twoPlayerGame.Invitee.Id == sender.LoggedinUser.Id) + otherUser = twoPlayerGame.Inviting; + else if (twoPlayerGame.Inviting.Id == sender.LoggedinUser.Id) + otherUser = twoPlayerGame.Invitee; + + response = PacketBuilder.Create2PlayerClose(); + otherUser.LoggedinClient.SendPacket(response); + + twoPlayerGame.CloseGame(sender.LoggedinUser); + + } break; case PacketBuilder.SWFMODULE_ARENA: @@ -6472,6 +6531,7 @@ namespace HISP.Server // Leave multirooms Multiroom.LeaveAllMultirooms(sender.LoggedinUser); + TwoPlayer.TwoPlayerRemove(sender.LoggedinUser); // Remove Trade Reference sender.LoggedinUser.TradingWith = null; diff --git a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs index d91aef1..53197c5 100755 --- a/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs +++ b/Horse Isle Server/HorseIsleServer/Server/PacketBuilder.cs @@ -113,7 +113,11 @@ namespace HISP.Server public const byte HORSE_CAUGHT = 0x1D; public const byte SWFMODULE_INVITE = 0x14; + public const byte SWFMODULE_ACCEPT = 0x15; + public const byte SWFMODULE_CLOSE = 0x16; + public const byte SWFMODULE_2PLAYER_CLOSED = 0x58; + public const byte SWFMODULE_2PLAYER = 0x50; public const byte SWFMODULE_ARENA = 0x52; public const byte SWFMODULE_BRICKPOET = 0x5A; public const byte SWFMODULE_DRAWINGROOM = 0x5B; @@ -214,6 +218,18 @@ namespace HISP.Server public const byte DIRECTION_TELEPORT = 4; public const byte DIRECTION_NONE = 10; + public static byte[] Create2PlayerClose() + { + MemoryStream ms = new MemoryStream(); + ms.WriteByte(PACKET_SWFMODULE); + ms.WriteByte(SWFMODULE_2PLAYER_CLOSED); + ms.WriteByte(PACKET_TERMINATOR); + + ms.Seek(0x00, SeekOrigin.Begin); + byte[] response = ms.ToArray(); + ms.Dispose(); + return response; + } public static byte[] CreateDressupRoomPeiceMove(int peiceId, double x, double y, bool active) { MemoryStream ms = new MemoryStream();