mirror of
https://github.com/islehorse/HISP.git
synced 2025-04-12 07:59:48 +12:00
Implement 2PLAYER ...
This commit is contained in:
parent
32a288c58a
commit
6256c38414
7 changed files with 145 additions and 24 deletions
|
@ -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%)",
|
||||||
|
|
||||||
|
|
|
@ -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")
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -1893,6 +1893,7 @@ namespace HISP.Server
|
||||||
Messages.BallonCutscene = gameData.transport.ballon_cutscene;
|
Messages.BallonCutscene = gameData.transport.ballon_cutscene;
|
||||||
|
|
||||||
gameData = null;
|
gameData = null;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Add table
Reference in a new issue