[ADD] added hosting a lobby

This commit is contained in:
Sem van der Hoeven
2020-10-20 22:16:19 +02:00
parent 671951c35b
commit 7b30911cd7
6 changed files with 93 additions and 17 deletions

View File

@@ -8,6 +8,7 @@ using static SharedClientServer.JSONConvert;
namespace Client namespace Client
{ {
public delegate void OnLobbyCreated(int id, int playersIn, int playersMax);
class Client : ObservableObject class Client : ObservableObject
{ {
private TcpClient tcpClient; private TcpClient tcpClient;
@@ -20,6 +21,7 @@ namespace Client
private string username; private string username;
public Callback OnSuccessfullConnect; public Callback OnSuccessfullConnect;
public Callback OnLobbiesListReceived; public Callback OnLobbiesListReceived;
public OnLobbyCreated OnLobbyCreated;
public Lobby[] Lobbies { get; set; } public Lobby[] Lobbies { get; set; }
public Client(string username) public Client(string username)
@@ -98,6 +100,14 @@ namespace Client
case LobbyIdentifier.LIST: case LobbyIdentifier.LIST:
Lobbies = JSONConvert.GetLobbiesFromMessage(payload); Lobbies = JSONConvert.GetLobbiesFromMessage(payload);
OnLobbiesListReceived?.Invoke(); OnLobbiesListReceived?.Invoke();
break;
case LobbyIdentifier.HOST:
// we receive this when the server has made us a host of a new lobby
// TODO get the new lobby and the id
Debug.WriteLine("[CLIENT] got lobby object");
Lobby lobby = JSONConvert.GetLobby(payload);
OnLobbyCreated?.Invoke(lobby.ID,lobby.PlayersIn,lobby.MaxPlayers);
break; break;
} }
//TODO fill lobby with the data received //TODO fill lobby with the data received

View File

@@ -30,18 +30,35 @@ namespace Client
_lobbies = new ObservableCollection<Lobby>(); _lobbies = new ObservableCollection<Lobby>();
client = ClientData.Instance.Client; client = ClientData.Instance.Client;
client.OnLobbiesListReceived = updateLobbies; client.OnLobbiesListReceived = updateLobbies;
//_lobbies.Add(new Lobby(50, 3, 8));
//_lobbies.Add(new Lobby(69, 1, 9));
//_lobbies.Add(new Lobby(420, 7, 7));
OnHostButtonClick = new RelayCommand(() => OnHostButtonClick = new RelayCommand(hostGame);
{
Debug.WriteLine("Host button clicked");
});
JoinSelectedLobby = new RelayCommand(startGameInLobby, true); JoinSelectedLobby = new RelayCommand(startGameInLobby, true);
} }
private void hostGame()
{
Debug.WriteLine("attempting to host game for " + ClientData.Instance.User.Username);
client.SendMessage(JSONConvert.ConstructLobbyHostMessage());
client.OnLobbyCreated = becomeHostForLobby;
}
private void becomeHostForLobby(int id, int players, int maxplayers)
{
Debug.WriteLine($"got host succes with data {id} {players} {maxplayers} ");
Lobby newLobby = new Lobby(id, players, maxplayers);
SelectedLobby = newLobby;
Application.Current.Dispatcher.Invoke(delegate
{
_lobbies.Add(newLobby);
startGameInLobby();
});
}
private void updateLobbies() private void updateLobbies()
{ {
Lobby[] lobbiesArr = client.Lobbies; Lobby[] lobbiesArr = client.Lobbies;
@@ -61,13 +78,17 @@ namespace Client
if (SelectedLobby != null) if (SelectedLobby != null)
{ {
ClientData.Instance.Lobby = SelectedLobby; ClientData.Instance.Lobby = SelectedLobby;
startGameWindow();
_model.CanStartGame = false;
GameWindow window = new GameWindow();
window.Show();
} }
} }
private void startGameWindow()
{
_model.CanStartGame = false;
GameWindow window = new GameWindow();
window.Show();
}
private void ClickCheck() private void ClickCheck()
{ {
if(!(_model.Status)) if(!(_model.Status))

View File

@@ -1,4 +1,5 @@
 
using Client;
using SharedClientServer; using SharedClientServer;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -129,6 +130,12 @@ namespace Server.Models
Debug.WriteLine("[SERVERCLIENT] got lobby request message, sending lobbies..."); Debug.WriteLine("[SERVERCLIENT] got lobby request message, sending lobbies...");
sendMessage(JSONConvert.ConstructLobbyListMessage(ServerCommunication.INSTANCE.lobbies.ToArray())); sendMessage(JSONConvert.ConstructLobbyListMessage(ServerCommunication.INSTANCE.lobbies.ToArray()));
break; break;
case LobbyIdentifier.HOST:
// add new lobby and add this serverclient to it
Lobby created = ServerCommunication.INSTANCE.HostForLobby(this.User);
Debug.WriteLine("[SERVERCLIENT] created lobby");
sendMessage(JSONConvert.ConstructLobbyHostCreatedMessage(created));
break;
} }
break; break;
case JSONConvert.CANVAS: case JSONConvert.CANVAS:

View File

@@ -148,5 +148,14 @@ namespace Server.Models
} }
} }
} }
public Lobby HostForLobby(User user)
{
Lobby lobby = new Lobby( lobbies.Count + 1,0, 8);
lobbies.Add(lobby);
serverClientsInlobbies.Add(lobby, new List<ServerClient>());
AddToLobby(lobby, user);
return lobby;
}
} }
} }

View File

@@ -46,6 +46,25 @@ namespace SharedClientServer
}); });
} }
#region lobby messages
public static byte[] ConstructLobbyHostMessage()
{
return GetMessageToSend(LOBBY, new
{
identifier = LobbyIdentifier.HOST
});
}
public static byte[] ConstructLobbyHostCreatedMessage(Lobby l)
{
return GetMessageToSend(LOBBY, new
{
identifier = LobbyIdentifier.HOST,
lobby = l
}) ;
}
public static byte[] ConstructLobbyRequestMessage() public static byte[] ConstructLobbyRequestMessage()
{ {
return GetMessageToSend(LOBBY, new return GetMessageToSend(LOBBY, new
@@ -80,6 +99,11 @@ namespace SharedClientServer
id = lobbyID id = lobbyID
}); });
} }
public static LobbyIdentifier GetLobbyIdentifier(byte[] json)
{
dynamic payload = JsonConvert.DeserializeObject(Encoding.ASCII.GetString(json));
return payload.identifier;
}
public static Lobby[] GetLobbiesFromMessage(byte[] json) public static Lobby[] GetLobbiesFromMessage(byte[] json)
{ {
@@ -95,6 +119,15 @@ namespace SharedClientServer
return payload.id; return payload.id;
} }
public static Lobby GetLobby(byte[] json)
{
dynamic payload = JsonConvert.DeserializeObject(Encoding.ASCII.GetString(json));
JObject dynamicAsObject = payload.lobby;
return dynamicAsObject.ToObject<Lobby>();
}
#endregion
/// <summary> /// <summary>
/// constructs a message that can be sent to the clients or server /// constructs a message that can be sent to the clients or server
/// </summary> /// </summary>
@@ -116,10 +149,6 @@ namespace SharedClientServer
return res; return res;
} }
public static LobbyIdentifier GetLobbyIdentifier(byte[] json)
{
dynamic payload = JsonConvert.DeserializeObject(Encoding.ASCII.GetString(json));
return payload.identifier;
}
} }
} }

View File

@@ -64,7 +64,7 @@ namespace Client
public int PlayersIn public int PlayersIn
{ {
get { return _playersIn; } get { return _users.Count; }
set { _playersIn = value; } set { _playersIn = value; }
} }