Implement 2PLAYER ...

This commit is contained in:
SilicaAndPina 2021-03-14 18:11:20 +13:00
parent 32a288c58a
commit 6256c38414
7 changed files with 145 additions and 24 deletions

View file

@ -222,7 +222,7 @@
"other_player":"^LThe following other players are in the game room:^R1", "other_player":"^LThe following other players are in the game room:^R1",
"player_name":"^T3%PLAYERNAME%", "player_name":"^T3%PLAYERNAME%",
"invite_button":"^B2I%PLAYERID%", "invite_button":"^B2I%PLAYERID%",
"accept_button":"^B2A%PLATERID%", "accept_button":"^B2A%PLAYERID%",
"sent_invite":" (sent invite)", "sent_invite":" (sent invite)",
"playing_with":" (playing with %PLAYERNAME%)", "playing_with":" (playing with %PLAYERNAME%)",

View file

@ -16,6 +16,8 @@ namespace HISP.Game
{ {
// Meta // Meta
private static bool overwrite = false;
private static string buildLocationString(int x, int y) private static string buildLocationString(int x, int y)
{ {
string areaString = buildAreaString(x, y); string areaString = buildAreaString(x, y);
@ -2651,6 +2653,7 @@ namespace HISP.Game
username = twoPlayerGame.Invitee.Username; username = twoPlayerGame.Invitee.Username;
else else
username = twoPlayerGame.Inviting.Username; username = twoPlayerGame.Inviting.Username;
overwrite = true;
return Messages.Format2PlayerGameInProgress(username); return Messages.Format2PlayerGameInProgress(username);
} }
@ -2903,7 +2906,13 @@ namespace HISP.Game
} }
if(TileCode == "2PLAYER") if(TileCode == "2PLAYER")
{ {
message += build2PlayerGame(user, TileArg); string msg = build2PlayerGame(user, TileArg);
if (!overwrite)
message += msg;
else
message = msg;
overwrite = false;
} }
if(TileCode == "HORSES") if(TileCode == "HORSES")
{ {

View file

@ -9,7 +9,16 @@ namespace HISP.Game
public class TwoPlayer public class TwoPlayer
{ {
public static List<TwoPlayer> TwoPlayerGames = new List<TwoPlayer>(); public static List<TwoPlayer> TwoPlayerGames = new List<TwoPlayer>();
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) public static bool IsPlayerInvitingPlayer(User sender, User checkInvites)
{ {
foreach (TwoPlayer twoPlayerGame in TwoPlayerGames.ToArray()) foreach (TwoPlayer twoPlayerGame in TwoPlayerGames.ToArray())
@ -21,6 +30,17 @@ namespace HISP.Game
} }
return false; 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) public static bool IsPlayerInGame(User user)
{ {
@ -83,7 +103,7 @@ namespace HISP.Game
Invitee.MetaPriority = false; Invitee.MetaPriority = false;
Inviting.MetaPriority = false; Inviting.MetaPriority = false;
GameServer.UpdateAreaForAll(Invitee.X, Invitee.Y); update();
TwoPlayerGames.Remove(this); TwoPlayerGames.Remove(this);
} }
@ -147,10 +167,17 @@ namespace HISP.Game
if(user.Id == Inviting.Id) if(user.Id == Inviting.Id)
{ {
Accepted = true; Accepted = true;
updateOthers();
deleteTimer.Dispose(); 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[] loadSwfInvitee = PacketBuilder.CreateSwfModulePacket(buildSwf(2), PacketBuilder.PACKET_SWF_MODULE_FORCE);
byte[] loadSwfInvited = PacketBuilder.CreateSwfModulePacket(buildSwf(1), 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) 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; 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; Invitee.MetaPriority = false;
Inviting.MetaPriority = false; Inviting.MetaPriority = false;
UpdateAll();
if (!closeSilently)
UpdateAll();
else
updateOthers();
TwoPlayerGames.Remove(this); TwoPlayerGames.Remove(this);
} }
} }

View file

@ -17,7 +17,7 @@
<Content Include="icon.ico" /> <Content Include="icon.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MySqlConnector" Version="1.2.1" /> <PackageReference Include="MySqlConnector" Version="1.3.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>

View file

@ -1893,6 +1893,7 @@ namespace HISP.Server
Messages.BallonCutscene = gameData.transport.ballon_cutscene; Messages.BallonCutscene = gameData.transport.ballon_cutscene;
gameData = null; gameData = null;
return;
} }
} }

View file

@ -3326,6 +3326,31 @@ namespace HISP.Server
TwoPlayer twoPlayerGame = new TwoPlayer(toInvite, sender.LoggedinUser, false); TwoPlayer twoPlayerGame = new TwoPlayer(toInvite, sender.LoggedinUser, false);
} }
break; 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: case PacketBuilder.SWFMODULE_DRAWINGROOM:
if(packet.Length < 3) if(packet.Length < 3)
{ {
@ -3724,13 +3749,47 @@ namespace HISP.Server
} }
} }
break; break;
case PacketBuilder.SWFMODULE_BANDHALL: // Basic case PacketBuilder.SWFMODULE_BANDHALL:
byte[] response = PacketBuilder.CreateForwardedSwfRequest(packet); byte[] response = PacketBuilder.CreateForwardedSwfRequest(packet);
foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y)) foreach (User user in GetUsersAt(sender.LoggedinUser.X, sender.LoggedinUser.Y))
{ {
if (user.Id == sender.LoggedinUser.Id) if (user.Id == sender.LoggedinUser.Id)
continue; continue;
user.LoggedinClient.SendPacket(response); 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; break;
case PacketBuilder.SWFMODULE_ARENA: case PacketBuilder.SWFMODULE_ARENA:
@ -6472,6 +6531,7 @@ namespace HISP.Server
// Leave multirooms // Leave multirooms
Multiroom.LeaveAllMultirooms(sender.LoggedinUser); Multiroom.LeaveAllMultirooms(sender.LoggedinUser);
TwoPlayer.TwoPlayerRemove(sender.LoggedinUser);
// Remove Trade Reference // Remove Trade Reference
sender.LoggedinUser.TradingWith = null; sender.LoggedinUser.TradingWith = null;

View file

@ -113,7 +113,11 @@ namespace HISP.Server
public const byte HORSE_CAUGHT = 0x1D; public const byte HORSE_CAUGHT = 0x1D;
public const byte SWFMODULE_INVITE = 0x14; 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_ARENA = 0x52;
public const byte SWFMODULE_BRICKPOET = 0x5A; public const byte SWFMODULE_BRICKPOET = 0x5A;
public const byte SWFMODULE_DRAWINGROOM = 0x5B; public const byte SWFMODULE_DRAWINGROOM = 0x5B;
@ -214,6 +218,18 @@ namespace HISP.Server
public const byte DIRECTION_TELEPORT = 4; public const byte DIRECTION_TELEPORT = 4;
public const byte DIRECTION_NONE = 10; 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) public static byte[] CreateDressupRoomPeiceMove(int peiceId, double x, double y, bool active)
{ {
MemoryStream ms = new MemoryStream(); MemoryStream ms = new MemoryStream();